MadExcept did not help. :(( ----- Original Message ----- From: "Arno Garrels" <[EMAIL PROTECTED]> To: "ICS support mailing" <[email protected]> Sent: Friday, February 02, 2007 10:47 AM Subject: Re: [twsocket] THttpMTServer problem with Dup
> Fastream Technologies wrote: >> The exception is thrown in the function I sent. Does that mean that >> the unprotected buffer is in that function? Or could it be anywhere?? > > The new send buffer in V6 doesn't use a TList but a linked list (which > is faster). I won't rely too much on the debugger in multi-threaded > applications. "List index out of bounds()" is obviously raised at > another location. If you want such errors happen more often debug > on a multi-processor system. MadExcept can be very helpfull too since > its bug reports show you the thread as well as the source code line > where the exception happend. > > Good luck, > > Arno Garrels > >> Best Regards, >> >> SZ >> >> ----- Original Message ----- >> From: "Arno Garrels" <[EMAIL PROTECTED]> >> To: "ICS support mailing" <[email protected]> >> Sent: Thursday, February 01, 2007 6:42 PM >> Subject: Re: [twsocket] THttpMTServer problem with Dup >> >> >>> Fastream Technologies wrote: >>>> Q: Do one need to protect Terminated variable of TThread and >>>> Terminate() as well? >>> >>> No, read/write of property Terminated should be atomic, so you >>> won't get an error but a critical section may be usefull. >>> >>> if not Thread.Terminated then >>> Thread.Terminate; >>> >>> If you do this from multiple threads it may happen this: >>> >>> if not Thread.Terminated then >>> // thread switch occures and another >>> // thread calls Terminate so >>> // Terminated is now TRUE!! >>> Thread.Terminate; >>> >>> >>> --- >>> Arno Garrels [TeamICS] >>> http://www.overbyte.be/eng/overbyte/teamics.html >>> >>> >>>> >>>> Best Regards, >>>> >>>> SZ >>>> >>>> ----- Original Message ----- >>>> From: "Arno Garrels" <[EMAIL PROTECTED]> >>>> To: "ICS support mailing" <[email protected]> >>>> Sent: Thursday, February 01, 2007 4:31 PM >>>> Subject: Re: [twsocket] THttpMTServer problem with Dup >>>> >>>> >>>>> Fastream Technologies wrote: >>>>> >>>>>>> I don't know this exception message, do you mean "List index out >>>>>>> of bounds()"? >>>>>> >>>>>> Yes, exactly. >>>>> >>>>> So most likely you hit a synchronization bug in your code, hard to >>>>> say what's wrong. Critical stuff is access to the client list, >>>>> add/remove clients and iterate. Those things need to be >>>>> protected very carefully. Only one thread may access the list >>>>> at the same time. Also reading property ClientCount is unreliable >>>>> since right after a read its value may already have changed. >>>>> Especially take care what happens when a client disconnects as >>>>> well as handle all possible exceptions inside the threads, >>>>> including component exceptions. It may help if you use a >>>>> TThreadList instead of current TList, at least it's easier to code >>>>> thread-safe. >>>>> >>>>> --- >>>>> Arno Garrels [TeamICS] >>>>> http://www.overbyte.be/eng/overbyte/teamics.html >>>>> >>>>> >>>>>> >>>>>>> >>>>>>> According to procedure Dup, the component state does not seem to >>>>>>> be wsClosed. >>>>>>> >>>>>>> procedure TCustomWSocket.Dup(NewHSocket : TSocket); >>>>>>> var >>>>>>> iStatus : Integer; >>>>>>> optlen : Integer; >>>>>>> begin >>>>>>> .. >>>>>>> if FState <> wsClosed then begin >>>>>>> iStatus := WSocket_Synchronized_closesocket(FHSocket); >>>>>>> FHSocket := INVALID_SOCKET; >>>>>>> if iStatus <> 0 then begin >>>>>>> SocketError('Dup (closesocket)'); >>>>>>> Exit; >>>>>>> end; >>>>>>> >>>>>>> ChangeState(wsClosed); >>>>>>> end; >>>>>>> FHsocket := NewHSocket; >>>>>>> .. >>>>>>> >>>>>>> --- >>>>>>> Arno Garrels [TeamICS] >>>>>>> http://www.overbyte.be/eng/overbyte/teamics.html >>>>>>> >>>>>>> >>>>>>> >>>>>>> Fastream Technologies wrote: >>>>>>>> Hello, >>>>>>>> >>>>>>>> I have the following function called from worker thread context >>>>>>>> (NewHSocket passed with a message): >>>>>>>> >>>>>>>> function TCustomWSocketMTServer.AfterClientCreated( >>>>>>>> Client : TWSocketMTClient; Error: Word; NewHSocket: >>>>>>>> integer) : boolean; var >>>>>>>> currentClientCount: integer; >>>>>>>> currentMaxClients: integer; >>>>>>>> begin >>>>>>>> Result := TRUE; >>>>>>>> >>>>>>>> FCriticalSection.Enter; >>>>>>>> Inc(FClientNum); >>>>>>>> Client.Name := Name + 'Client' + >>>>>>>> IntToStr(FClientNum); FClientList.Add(Client); >>>>>>>> currentClientCount := FClientList.Count; >>>>>>>> Client.Banner := FBanner; >>>>>>>> Client.Server := Self; >>>>>>>> currentMaxClients := FMaxClients; >>>>>>>> FCriticalSection.Leave; >>>>>>>> >>>>>>>> {$IFNDEF NO_DEBUG_LOG} >>>>>>>> Client.IcsLogger := IcsLogger; >>>>>>>> { V5.04 } {$ENDIF} >>>>>>>> >>>>>>>> Client.Dup(NewHSocket); // SOMETIMES WHEN HIGH LOAD IS IN >>>>>>>> PLACE, THIS FUNCTION MAKES CLIENT.HSOCKET = -1 AND RAISES THE >>>>>>>> EXCEPTION "LIST ITEM OUT OF INDEX" >>>>>>>> Client.OnDataSent := nil; >>>>>>>> >>>>>>>> TriggerClientConnect(Client, Error); >>>>>>>> >>>>>>>> { Ok, the client is still there, process with the >>>>>>>> connection } if (currentMaxClients > 0) and >>>>>>>> (currentClientCount > currentMaxClients) then begin >>>>>>>> { Sorry, too much clients } >>>>>>>> Client.Banner := BannerTooBusy; >>>>>>>> Client.OnDataAvailable := nil; // should be set >>>>>>>> previously in initClient for non-503 >>>>>>>> Client.StartConnection; >>>>>>>> Client.CloseDelayed; >>>>>>>> >>>>>>>> Result := false; >>>>>>>> end; >>>>>>>> end; >>>>>>>> >>>>>>>> Any idea? >>>>>>>> >>>>>>>> Best Regards, >>>>>>>> >>>>>>>> SZ >>>>>>> -- >>>>>>> To unsubscribe or change your settings for TWSocket mailing list >>>>>>> please goto http://www.elists.org/mailman/listinfo/twsocket >>>>>>> Visit our website at http://www.overbyte.be >>>>> -- >>>>> To unsubscribe or change your settings for TWSocket mailing list >>>>> please goto http://www.elists.org/mailman/listinfo/twsocket >>>>> Visit our website at http://www.overbyte.be >>> -- >>> To unsubscribe or change your settings for TWSocket mailing list >>> please goto http://www.elists.org/mailman/listinfo/twsocket >>> Visit our website at http://www.overbyte.be > -- > To unsubscribe or change your settings for TWSocket mailing list > please goto http://www.elists.org/mailman/listinfo/twsocket > Visit our website at http://www.overbyte.be -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
