X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/4782a5c5afee47721cc617daa40dd29828342c2b..f292b938e3856ed9fb8fb45bb96d72fab1ed494f:/lcorewsaasyncselect.pas?ds=inline

diff --git a/lcorewsaasyncselect.pas b/lcorewsaasyncselect.pas
index a978c23..622c92e 100755
--- a/lcorewsaasyncselect.pas
+++ b/lcorewsaasyncselect.pas
@@ -2,8 +2,11 @@ unit lcorewsaasyncselect;
 
 interface
 
+procedure lcoreinit;
+
 implementation
-uses wcore,lcore,bsearchtree,sysutils,windows,winsock,pgtypes,messages,classes;
+
+uses wcore,lcore,bsearchtree,sysutils,windows,winsock,pgtypes,messages,classes,lsocket;
 type
   twineventcore=class(teventcore)
   public
@@ -78,10 +81,10 @@ end;
 procedure twineventcore.rmasterset(fd : integer;islistensocket : boolean);
 begin
   if islistensocket then begin
-    //writeln('setting accept watch for socket number ',fd);
+//    writeln('setting accept watch for socket number ',fd);
     dowsaasyncselect(fd,FD_ACCEPT or FD_CLOSE,0);
   end else begin
-    //writeln('setting read watch for socket number',fd);
+//    writeln('setting read watch for socket number',fd);
     dowsaasyncselect(fd,FD_READ or FD_CLOSE,0);
   end;
 end;
@@ -116,30 +119,33 @@ var
   writetrigger : boolean;
   lasio : tlasio;
 begin
-  //writeln('got a message');
+//  writeln('got a message');
   Result := 0;  // This means we handled the message
   if (ahwnd=hwndlcore) and (aumsg=wm_user) then begin
-    //writeln('it appears to be a response to our wsaasyncselect');
+//    writeln('it appears to be a response to our wsaasyncselect');
     socket := awparam;
     event := alparam and $FFFF;
     error := alparam shr 16;
-    //writeln('socket=',socket,' event=',event,' error=',error);
+//    writeln('socket=',socket,' event=',event,' error=',error);
     readtrigger := false;
     writetrigger := false;
     lasio := findtree(@fdreverse,inttostr(socket));
     if assigned(lasio) then begin
       if (error <> 0) or ((event and FD_CLOSE) <> 0) then begin
-        if lasio.state = wsconnecting then begin
-          lasio.onsessionconnected(lasio,error);
+        if (lasio.state = wsconnecting) and (error <> 0) then begin
+          if lasio is tlsocket then tlsocket(lasio).connectionfailedhandler(error)
+        end else begin
+          lasio.internalclose(error);
         end;
-        lasio.internalclose(error);
       end else begin
         if (event and (FD_READ or FD_ACCEPT)) <> 0 then readtrigger := true;
         if (event and (FD_WRITE)) <> 0 then writetrigger := true;
 
         if readtrigger or writetrigger then lasio.handlefdtrigger(readtrigger,writetrigger);
       end;
-      dowsaasyncselect(socket,0,0); //reset watches
+      // don't reset the event manually for listen sockets to avoid unwanted
+      // extra onsessionavailible events
+      if (taddrint(findtree(@fdwatches,inttostr(socket))) and (FD_ACCEPT)) = 0 then dowsaasyncselect(socket,0,0); // if not a listen socket reset watches
     end;
   end else if (ahwnd=hwndlcore) and (aumsg=wm_dotasks) then begin
       //writeln('processing tasks');
@@ -193,9 +199,14 @@ var
                                  lpszClassName : 'lcoreClass');
   GInitData: TWSAData;
 
+var
+  inited:boolean;
+procedure lcoreinit;
 begin
+  if (inited) then exit;
+
   eventcore := twineventcore.create;
-    if Windows.RegisterClass(MyWindowClass) = 0 then halt;
+  if Windows.RegisterClass(MyWindowClass) = 0 then halt;
   //writeln('about to create lcore handle, hinstance=',hinstance);
   hwndlcore := CreateWindowEx(WS_EX_TOOLWINDOW,
                                MyWindowClass.lpszClassName,
@@ -212,5 +223,11 @@ begin
   onaddtask := winaddtask;
   timerwrapperinterface := twintimerwrapperinterface.create(nil);
 
-  WSAStartup($200, GInitData);
+  WSAStartup(2, GInitData);
+  absoloutemaxs := maxlongint;
+
+
+  inited := true;
+end;
+
 end.