X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/0ac6b47e810e6efaebcdbf3075b633e9b4109341..a77cd534c22418ec9a8a22ae42efef1a9500b193:/lcoreselect.pas?ds=inline

diff --git a/lcoreselect.pas b/lcoreselect.pas
old mode 100755
new mode 100644
index 3cee9bf..ad81600
--- a/lcoreselect.pas
+++ b/lcoreselect.pas
@@ -21,7 +21,7 @@ uses
   {$ifdef VER1_0}
     linux,
   {$else}
-    baseunix,unix,unixutil,
+    baseunix,unix,unixutil,sockets,
   {$endif}
   fd_utils;
 var
@@ -40,15 +40,15 @@ uses
   {$ifndef nosignal}
     lsignal,
   {$endif}
-  ltimevalstuff;
+  ltimevalstuff;
 
 {$include unixstuff.inc}
 
 const
-  absoloutemaxs_select = (sizeof(fdset)*8)-1;
+  absolutemaxs_select = (sizeof(fdset)*8)-1;
 
 var
-  fdreverse:array[0..absoloutemaxs_select] of tlasio;
+  fdreverse:array[0..absolutemaxs_select] of tlasio;
 type
   tselecteventcore=class(teventcore)
     public
@@ -64,12 +64,12 @@ type
 
 procedure processtimers;inline;
 var
-  tv           ,tvnow     : ttimeval ;
+  tvnow     : ttimeval ;
   currenttimer            : tltimer   ;
   temptimer               : tltimer  ;
 
 begin
-  gettimeofday(tvnow);
+  gettimemonotonic(tvnow);
   currenttimer := firsttimer;
   while assigned(currenttimer) do begin
     //writeln(currenttimer.enabled);
@@ -90,35 +90,40 @@ end;
 procedure processasios(var fdsr,fdsw:fdset);//inline;
 var
   currentsocket : tlasio  ;
-  tempsocket    : tlasio  ;
-  socketcount   : integer ; // for debugging perposes :)
+  socketcount   : integer ; // for debugging purposes :)
   dw,bt:integer;
+  currentfdword:fdword;
+  fd : integer;
 begin
+  //writeln('entering processasios');
 {  inc(lcoretestcount);}
 
-    //the message loop will exit if all lasio's and ltimer's and lsignal's are destroyed
+    //the message loop will exit if all lasios and ltimers and lsignals are destroyed
     //if (not assigned(firstasin)) and (not assigned(firsttimer)) and (not assigned(firstsignal)) then exit;
 
 
   {------- test optimised loop}
   socketcount := 0;
-  for dw := (maxs shr 5) downto 0 do if (fdsr[dw] or fdsw[dw]) <> 0 then begin
-    for bt := 0 to 31 do if (fdsr[dw] or fdsw[dw]) and (1 shl bt) <> 0 then begin
+  for dw := (maxs shr fdwordshift) downto 0 do if (fdsr[dw] or fdsw[dw]) <> 0 then begin
+    currentfdword := (fdsr[dw] or fdsw[dw]);
+    for bt := fdwordmaxbit downto 0 do if currentfdword and (1 shl bt) <> 0 then begin
       inc(socketcount);
-      currentsocket := fdreverse[dw shl 5 or bt];
+      fd := dw shl fdwordshift or bt;
+      //writeln('reversing fd ',fd);
+      currentsocket := fdreverse[fd];
       {if not assigned(currentsocket) then raise exception.create('currentsocket not assigned');
       if currentsocket.fdhandlein < 0 then raise exception.create('currentsocket.fdhandlein out of range');}
       {i've seen the out of range case actually happening, so it can happen. test: just close the fd - beware}
       if not assigned(currentsocket) then begin
-        fdclose(dw shl 5 or bt);
+        fdclose(fd);
         continue
       end;
       if currentsocket.fdhandlein < 0 then begin
-        fdclose(dw shl 5 or bt);
+        fdclose(fd);
         continue
       end;
       try
-        currentsocket.handlefdtrigger(fd_isset(currentsocket.fdhandlein,fdsr),fd_isset(currentsocket.fdhandleout,fdsw));
+        currentsocket.handlefdtrigger(fd_isset(fd,fdsr),fd_isset(fd,fdsw));
       except
         on E: exception do begin
           currentsocket.HandleBackGroundException(e);
@@ -139,7 +144,7 @@ begin
   - sockets which are released may not be freed because theyre never processed by the loop
   made new code for handling this, using asinreleaseflag
 
-  - when/why does the mustrefreshfds select apply, sheck if i did it correctly?
+  - when/why does the mustrefreshfds select apply, check if i did it correctly?
 
   - what happens if calling handlefdtrigger for a socket which does not have an event
   }
@@ -172,6 +177,7 @@ begin
     end;
   end; *)
 {  debugout('socketcount='+inttostr(socketcount));}
+  //writeln('leaving processasios');
 end;
 
 procedure tselecteventcore.processmessages;
@@ -184,7 +190,7 @@ begin
     prepsigpipe;
   {$endif}
   selectresult := select(maxs+1,@fdsr,@fdsw,nil,0);
-  while (selectresult>0) or assigned(firsttask) or assigned(currenttask) do begin;
+  while (selectresult>0) or assigned(firsttask) do begin;
 
     processtasks;
     processtimers;
@@ -243,7 +249,7 @@ begin
     fd_zero(FDSW);
     if result=-1 then begin
       if linuxerror = SYS_EINTR then begin
-        // we received a signal it's not a problem
+        // we received a signal it is not a problem
       end else begin
         raise esocketexception.create('select returned error '+inttostr(linuxerror));
       end;
@@ -282,7 +288,7 @@ begin
 
   repeat
 
-    //the message loop will exit if all lasio's and ltimer's and lsignal's are destroyed
+    //the message loop will exit if all lasios and ltimers and lsignals are destroyed
     processtasks;
     //currenttask := nil;
     {beware}
@@ -303,8 +309,8 @@ begin
       selectresult := doselect(nil);
 
     end else begin
-      gettimeofday(tvnow);
-      tv_substract(tv,tvnow);
+      gettimemonotonic(tvnow);
+      tv_subtract(tv,tvnow);
 
       //writeln('timers active');
       if tv.tv_sec < 0 then begin
@@ -327,7 +333,8 @@ end;
 
 procedure tselecteventcore.rmasterset(fd : integer;islistensocket : boolean);
 begin
-  if fd > absoloutemaxs then raise esocketexception.create('file discriptor out of range');
+  //writeln('rmasterset called with fd ',fd);
+  if fd > absolutemaxs then raise esocketexception.create('file descriptor out of range');
   if fd > maxs then maxs := fd;
   if fd_isset(fd,fdsrmaster) then exit;
   fd_set(fd,fdsrmaster);
@@ -336,6 +343,7 @@ end;
 
 procedure tselecteventcore.rmasterclr(fd: integer);
 begin
+  //writeln('rmasterclr called with fd ',fd);
   if not fd_isset(fd,fdsrmaster) then exit;
   fd_clr(fd,fdsrmaster);
 
@@ -344,7 +352,8 @@ end;
 
 procedure tselecteventcore.wmasterset(fd : integer);
 begin
-  if fd > absoloutemaxs then raise esocketexception.create('file discriptor out of range');
+  //writeln('wmasterset called with fd ',fd);
+  if fd > absolutemaxs then raise esocketexception.create('file descriptor out of range');
   if fd > maxs then maxs := fd;
 
   if fd_isset(fd,fdswmaster) then exit;
@@ -354,6 +363,7 @@ end;
 
 procedure tselecteventcore.wmasterclr(fd: integer);
 begin
+  //writeln('wmasterclr called with fd ',fd);
   if not fd_isset(fd,fdswmaster) then exit;
   fd_clr(fd,fdswmaster);
 end;
@@ -372,7 +382,7 @@ begin
   inited := true;
   eventcore := tselecteventcore.create;
 
-  absoloutemaxs := absoloutemaxs_select;
+  absolutemaxs := absolutemaxs_select;
 
   maxs := 0;
   fd_zero(fdsrmaster);