X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/82d4e52fba54be50d719f6185ec381f2dc87fc6c..2579cad7a973072619a7fc17ff6af9cc75264972:/lcoreselect.pas

diff --git a/lcoreselect.pas b/lcoreselect.pas
index 0d99f6a..38da6ba 100755
--- 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
@@ -31,16 +31,18 @@ var
 function getfdsrmaster : fdset; {$ifdef useinline}inline;{$endif}
 function getfdswmaster : fdset; {$ifdef useinline}inline;{$endif}
 
+procedure lcoreinit;
+
 implementation
 uses
   lcore,sysutils,
   classes,pgtypes,bfifo,
   {$ifndef nosignal}
-    lsignal;
+    lsignal,
   {$endif}
+  ltimevalstuff;
 
 {$include unixstuff.inc}
-{$include ltimevalstuff.inc}
 
 const
   absoloutemaxs_select = (sizeof(fdset)*8)-1;
@@ -62,7 +64,7 @@ type
 
 procedure processtimers;inline;
 var
-  tv           ,tvnow     : ttimeval ;
+  tvnow     : ttimeval ;
   currenttimer            : tltimer   ;
   temptimer               : tltimer  ;
 
@@ -82,17 +84,18 @@ begin
     end;
     temptimer := currenttimer;
     currenttimer := currenttimer.nexttimer;
-    if temptimer.released then temptimer.free;
   end;
 end;
 
 procedure processasios(var fdsr,fdsw:fdset);//inline;
 var
   currentsocket : tlasio  ;
-  tempsocket    : tlasio  ;
   socketcount   : integer ; // for debugging perposes :)
   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
@@ -101,23 +104,26 @@ begin
 
   {------- 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);
@@ -133,17 +139,6 @@ begin
     end;
   end;
 
-  if asinreleaseflag then begin
-    asinreleaseflag := false;
-    currentsocket := firstasin;
-    while assigned(currentsocket) do begin
-      tempsocket := currentsocket;
-      currentsocket := currentsocket.nextasin;
-      if tempsocket.released then begin
-        tempsocket.free;
-      end;
-    end;
-  end;
   {
   !!! issues:
   - sockets which are released may not be freed because theyre never processed by the loop
@@ -182,6 +177,7 @@ begin
     end;
   end; *)
 {  debugout('socketcount='+inttostr(socketcount));}
+  //writeln('leaving processasios');
 end;
 
 procedure tselecteventcore.processmessages;
@@ -293,25 +289,6 @@ begin
   repeat
 
     //the message loop will exit if all lasio's and ltimer's and lsignal's are destroyed
-    if (not assigned(firstasin)) and (not assigned(firsttimer)) {$ifndef nosignal} and (not assigned(firstsignal)){$endif} then exit;
-    {fd_zero(FDSR);
-    fd_zero(FDSW);
-    currentsocket := firstasin;
-    if not assigned(currentsocket) then exit; //the message loop will exit if all lsockets are destroyed
-
-    repeat
-      if (not currentsocket.released) and (currentsocket.state<>wsclosed) then fd_set(currentsocket.fdhandlein,fdsr);
-      if (not currentsocket.released) and (currentsocket.state=wsconnecting) then fd_set(currentsocket.fdhandleout,fdsw);
-      if currentsocket is tlsocket then begin
-         if (not currentsocket.released) and (currentsocket.state=wsconnected) and(tlsocket(currentsocket).sendq <> '') then fd_set(currentsocket.fdhandleout,fdsw);
-      end;
-      tempsocket := currentsocket;
-      currentsocket := currentsocket.nextasin;
-      if tempsocket.released then begin
-        tempsocket.free;
-      end;
-    until not assigned(currentsocket);
-    }
     processtasks;
     //currenttask := nil;
     {beware}
@@ -356,6 +333,7 @@ end;
 
 procedure tselecteventcore.rmasterset(fd : integer;islistensocket : boolean);
 begin
+  //writeln('rmasterset called with fd ',fd);
   if fd > absoloutemaxs then raise esocketexception.create('file discriptor out of range');
   if fd > maxs then maxs := fd;
   if fd_isset(fd,fdsrmaster) then exit;
@@ -365,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);
 
@@ -373,6 +352,7 @@ end;
 
 procedure tselecteventcore.wmasterset(fd : integer);
 begin
+  //writeln('wmasterset called with fd ',fd);
   if fd > absoloutemaxs then raise esocketexception.create('file discriptor out of range');
   if fd > maxs then maxs := fd;
 
@@ -383,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;
@@ -392,9 +373,13 @@ begin
   fdreverse[fd] := reverseto;
 end;
 
+var
+  inited:boolean;
 
-
+procedure lcoreinit;
 begin
+  if inited then exit;
+  inited := true;
   eventcore := tselecteventcore.create;
 
   absoloutemaxs := absoloutemaxs_select;
@@ -402,4 +387,6 @@ begin
   maxs := 0;
   fd_zero(fdsrmaster);
   fd_zero(fdswmaster);
+end;
+
 end.