X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/9763940f8849e5c807566157829a1e6d2c9172ee..85edf7ed5948e0efe59301680f79ea0bac4367e8:/lcore.pas

diff --git a/lcore.pas b/lcore.pas
index d346c52..08c242a 100644
--- a/lcore.pas
+++ b/lcore.pas
@@ -106,6 +106,10 @@ interface
       lasterror:integer;
       destroying:boolean;
       recvbufsize:integer;
+      datasentcalled:boolean;
+      {$ifdef mswindows}
+      sendflushlasterror:integer;
+      {$endif}
       function receivestr:tbufferstring; virtual;
       procedure close;
       procedure abort;
@@ -221,7 +225,7 @@ procedure exitmessageloop;
 
 var
   firsttimer                            : tltimer    ;
-  firsttask  , lasttask   , currenttask : tltask     ;
+  firsttask  , lasttask                 : tltask     ;
 
   numread                               : integer    ;
   mustrefreshfds                        : boolean    ;
@@ -484,12 +488,17 @@ begin
     result := -1;
     exit;
   end;
+  datasentcalled := false;
 
   lensent := sendq.get(data,packetbasesize*2);
   if assigned(data) then result := myfdwrite(fdhandleout,data^,lensent) else result := 0;
 
   if result = -1 then lensent := 0 else lensent := result;
 
+  {$ifdef mswindows}
+  if (result = -1) then sendflushlasterror := getlasterror else sendflushlasterror := 0;
+  {$endif}
+
   //sendq := copy(sendq,lensent+1,length(sendq)-lensent);
   sendq.del(lensent);
 
@@ -562,14 +571,14 @@ begin
 
         end else begin
           {$ifdef mswindows}
-          if getlasterror=WSAEWOULDBLOCK then begin
+          if sendflushlasterror=WSAEWOULDBLOCK then begin
             //the asynchronous nature of windows messages means we sometimes
             //get here with the buffer full
             //so do nothing in that case
           end else
           {$endif}
           begin
-            internalclose({$ifdef mswindows}getlasterror{$else}linuxerror{$endif});
+            internalclose({$ifdef mswindows}sendflushlasterror{$else}linuxerror{$endif});
           end  
         end;
       end;
@@ -577,7 +586,13 @@ begin
     end else begin
       //everything is sent fire off ondatasent event
       if fdhandleout >= 0 then eventcore.wmasterclr(fdhandleout);//fd_clr(fdhandleout,fdswmaster);
-      if assigned(ondatasent) then tltask.create(self.dodatasent,self,0,0);
+      if assigned(ondatasent) then begin
+        if not datasentcalled then begin
+          tltask.create(self.dodatasent,self,0,0);
+          datasentcalled := true;
+        end;
+      end;
+
     end;
     if assigned(onfdwrite) then onfdwrite(self,0);
   end;
@@ -654,7 +669,7 @@ end;
 {$ifndef mswindows}
   procedure tltimer.resettimes;
   begin
-    gettimeofday(nextts);
+    gettimemonotonic(nextts);
     {if not initialevent then} tv_add(nextts,interval);
   end;
 {$endif}
@@ -798,26 +813,18 @@ end;
 
 procedure processtasks;//inline;
 var
-  temptask                : tltask   ;
-
+  currenttask:tltask;
 begin
 
-  if not assigned(currenttask) then begin
+  while assigned(firsttask) do begin
     currenttask := firsttask;
-    firsttask := nil;
-    lasttask  := nil;
-  end;
-  while assigned(currenttask) do begin
+    firsttask := firsttask.nexttask;
+    if not assigned(firsttask) then lasttask := nil;
 
     if assigned(currenttask.handler) then currenttask.handler(currenttask.wparam,currenttask.lparam);
-    if assigned(currenttask) then begin
-      temptask := currenttask;
-      currenttask := currenttask.nexttask;
-      temptask.free;
-    end;
-    //writeln('processed a task');
+    currenttask.free;
   end;
-
+  currenttask := nil;
 end;
 
 
@@ -826,23 +833,18 @@ end;
 procedure disconnecttasks(aobj:tobject);
 var
   currenttasklocal : tltask ;
-  counter          : byte   ;
+
 begin
-  for counter := 0 to 1 do begin
-    if counter = 0 then begin
-      currenttasklocal := firsttask; //main list of tasks
-    end else begin
-      currenttasklocal := currenttask; //needed in case called from a task
-    end;
-    // note i don't bother to destroy the links here as that will happen when
-    // the list of tasks is processed anyway
-    while assigned(currenttasklocal) do begin
-      if currenttasklocal.obj = aobj then begin
-        currenttasklocal.obj := nil;
-        currenttasklocal.handler := nil;
-      end;
-      currenttasklocal := currenttasklocal.nexttask;
+  currenttasklocal := firsttask; //main list of tasks
+
+  // note i don't bother to destroy the links here as that will happen when
+  // the list of tasks is processed anyway
+  while assigned(currenttasklocal) do begin
+    if currenttasklocal.obj = aobj then begin
+      currenttasklocal.obj := nil;
+      currenttasklocal.handler := nil;
     end;
+    currenttasklocal := currenttasklocal.nexttask;
   end;
 end;