fix 2 send related bugs
[lcore.git] / lcore.pas
index d346c528b2fc045172d8428b709389b7c6db9695..097ea79c8946d7dda19c9e0a18c5b9f24473f6bd 100644 (file)
--- a/lcore.pas
+++ b/lcore.pas
@@ -106,6 +106,10 @@ interface
       lasterror:integer;\r
       destroying:boolean;\r
       recvbufsize:integer;\r
+      datasentcalled:boolean;\r
+      {$ifdef mswindows}\r
+      sendflushlasterror:integer;\r
+      {$endif}\r
       function receivestr:tbufferstring; virtual;\r
       procedure close;\r
       procedure abort;\r
@@ -484,12 +488,17 @@ begin
     result := -1;\r
     exit;\r
   end;\r
+  datasentcalled := false;\r
 \r
   lensent := sendq.get(data,packetbasesize*2);\r
   if assigned(data) then result := myfdwrite(fdhandleout,data^,lensent) else result := 0;\r
 \r
   if result = -1 then lensent := 0 else lensent := result;\r
 \r
+  {$ifdef mswindows}\r
+  if (result = -1) then sendflushlasterror := getlasterror else sendflushlasterror := 0;\r
+  {$endif}\r
+\r
   //sendq := copy(sendq,lensent+1,length(sendq)-lensent);\r
   sendq.del(lensent);\r
 \r
@@ -562,14 +571,14 @@ begin
 \r
         end else begin\r
           {$ifdef mswindows}\r
-          if getlasterror=WSAEWOULDBLOCK then begin\r
+          if sendflushlasterror=WSAEWOULDBLOCK then begin\r
             //the asynchronous nature of windows messages means we sometimes\r
             //get here with the buffer full\r
             //so do nothing in that case\r
           end else\r
           {$endif}\r
           begin\r
-            internalclose({$ifdef mswindows}getlasterror{$else}linuxerror{$endif});\r
+            internalclose({$ifdef mswindows}sendflushlasterror{$else}linuxerror{$endif});\r
           end  \r
         end;\r
       end;\r
@@ -577,7 +586,13 @@ begin
     end else begin\r
       //everything is sent fire off ondatasent event\r
       if fdhandleout >= 0 then eventcore.wmasterclr(fdhandleout);//fd_clr(fdhandleout,fdswmaster);\r
-      if assigned(ondatasent) then tltask.create(self.dodatasent,self,0,0);\r
+      if assigned(ondatasent) then begin\r
+        if not datasentcalled then begin\r
+          tltask.create(self.dodatasent,self,0,0);\r
+          datasentcalled := true;\r
+        end;\r
+      end;\r
+\r
     end;\r
     if assigned(onfdwrite) then onfdwrite(self,0);\r
   end;\r