X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/be01aa2e4e4e54fd8bb3ea27ac3c6b7978553b6e..e14f985630dc9b0edad92d591fbede30928cda37:/lcore.pas

diff --git a/lcore.pas b/lcore.pas
index 7db6b3e..6effe0e 100755
--- a/lcore.pas
+++ b/lcore.pas
@@ -73,8 +73,9 @@ interface
     TSendData          = procedure (Sender: TObject; BytesSent: Integer) of object;
 
     tlcomponent = class(tcomponent)
+    private
+      procedure releasetaskhandler(wparam,lparam:longint);
     public
-      released:boolean;
       procedure release; virtual;
       destructor destroy; override;
     end;
@@ -94,8 +95,6 @@ interface
       onsenddata         : tsenddata      ;
       ondatasent         : tsocketevent      ;
       //connected          : boolean         ;
-      nextasin           : tlasio            ;
-      prevasin           : tlasio            ;
 
       recvq              : tfifo;
       OnBgException      : TBgExceptionEvent ;
@@ -227,7 +226,6 @@ procedure messageloop;
 procedure exitmessageloop;
 
 var
-  firstasin                             : tlasio     ;
   firsttimer                            : tltimer    ;
   firsttask  , lasttask   , currenttask : tltask     ;
 
@@ -285,12 +283,15 @@ begin
   inherited destroy;
 end;
 
-
+procedure tlcomponent.releasetaskhandler(wparam,lparam:longint);
+begin
+  free;
+end;
 
 
 procedure tlcomponent.release;
 begin
-  released := true;
+  addtask(releasetaskhandler,self,0,0);
 end;
 
 procedure tlasio.release;
@@ -343,26 +344,12 @@ begin
   state := wsclosed;
   fdhandlein := -1;
   fdhandleout := -1;
-  nextasin := firstasin;
-  prevasin := nil;
-  if assigned(nextasin) then nextasin.prevasin := self;
-  firstasin := self;
-
-  released := false;
 end;
 
 destructor tlasio.destroy;
 begin
   destroying := true;
   if state <> wsclosed then close;
-  if prevasin <> nil then begin
-    prevasin.nextasin := nextasin;
-  end else begin
-    firstasin := nextasin;
-  end;
-  if nextasin <> nil then begin
-    nextasin.prevasin := prevasin;
-  end;
   recvq.free;
   sendq.free;
   inherited destroy;
@@ -405,6 +392,9 @@ end;
 procedure tlasio.internalclose(error:word);
 begin
   if (state<>wsclosed) and (state<>wsinvalidstate) then begin
+    // -2 is a special indication that we should just exist silently
+    // (used for connect failure handling when socket creation fails)
+    if (fdhandlein = -2) and (fdhandleout = -2) then exit;
     if (fdhandlein < 0) or (fdhandleout < 0) then raise exception.create('internalclose called with invalid fd handles');
     eventcore.rmasterclr(fdhandlein);//fd_clr(fdhandlein,fdsrmaster);
     eventcore.wmasterclr(fdhandleout);//fd_clr(fdhandleout,fdswmaster);
@@ -749,8 +739,6 @@ begin
   end;
   interval := 1000;
   enabled := true;
-  released := false;
-
 end;
 
 destructor tltimer.destroy;
@@ -901,7 +889,6 @@ end;
 
 
 begin
-  firstasin := nil;
   firsttask := nil;