Q: Do one need to protect Terminated variable of TThread and Terminate() as well?
Best Regards, Gorkem Ates ----- 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
