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??
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
