git-svn-id: file:///svnroot/lcore/trunk@17 b1de8a11-f9be-4011-bde0-cc7ace90066a
[lcore.git] / lcore.pas
index 900bc96482e2d850e670ecb0fa6e7704693fc246..f6b0342410219fba55072aa7bf95c5a850661fff 100755 (executable)
--- a/lcore.pas
+++ b/lcore.pas
@@ -35,7 +35,10 @@ interface
 \r
 \r
   const\r
-    receivebufsize=1460;\r
+    receivebufsize=1460*8;\r
+\r
+  var\r
+    absoloutemaxs:integer=0;\r
 \r
   type\r
     {$ifdef ver1_0}\r
@@ -96,6 +99,7 @@ interface
       onfdwrite           : procedure (Sender: TObject; Error: word) of object; //added for bewarehttpd\r
       lasterror:integer;\r
       destroying:boolean;\r
+      recvbufsize:integer;\r
       function receivestr:string; virtual;\r
       procedure close;\r
       procedure abort;\r
@@ -326,6 +330,7 @@ end;
 constructor tlasio.create;\r
 begin\r
   inherited create(AOwner);\r
+  if not assigned(eventcore) then raise exception.create('no event core');\r
   sendq := tfifo.create;\r
   recvq := tfifo.create;\r
   state := wsclosed;\r
@@ -351,8 +356,8 @@ begin
   if nextasin <> nil then begin\r
     nextasin.prevasin := prevasin;\r
   end;\r
-  recvq.destroy;\r
-  sendq.destroy;\r
+  recvq.free;\r
+  sendq.free;\r
   inherited destroy;\r
 end;\r
 \r
@@ -392,7 +397,7 @@ end;
 \r
 procedure tlasio.internalclose(error:word);\r
 begin\r
-  if state<>wsclosed then begin\r
+  if (state<>wsclosed) and (state<>wsinvalidstate) then begin\r
     if (fdhandlein < 0) or (fdhandleout < 0) then raise exception.create('internalclose called with invalid fd handles');\r
     eventcore.rmasterclr(fdhandlein);//fd_clr(fdhandlein,fdsrmaster);\r
     eventcore.wmasterclr(fdhandleout);//fd_clr(fdhandleout,fdswmaster);\r
@@ -419,7 +424,7 @@ begin
 \r
     if assigned(onsessionclosed) then if not destroying then onsessionclosed(self,error);\r
   end;\r
-  sendq.del(maxlongint);\r
+  if assigned(sendq) then sendq.del(maxlongint);\r
 end;\r
 \r
 \r
@@ -548,6 +553,7 @@ procedure tlasio.handlefdtrigger(readtrigger,writetrigger:boolean);
 var\r
   sendflushresult : integer;\r
   tempbuf:array[0..receivebufsize-1] of byte;\r
+  a:integer;\r
 begin\r
   if (state=wsconnected) and writetrigger then begin\r
     //writeln('write trigger');\r
@@ -574,7 +580,9 @@ begin
   writtenthiscycle := false;\r
   if (state =wsconnected) and readtrigger then begin\r
     if recvq.size=0 then begin\r
-      numread := myfdread(fdhandlein,tempbuf,sizeof(tempbuf));\r
+      a := recvbufsize;\r
+      if (a <= 0) or (a > sizeof(tempbuf)) then a := sizeof(tempbuf);\r
+      numread := myfdread(fdhandlein,tempbuf,a);\r
       if (numread=0) and (not mustrefreshfds) then begin\r
         {if i remember correctly numread=0 is caused by eof\r
         if this isn't dealt with then you get a cpu eating infinite loop\r