MadExcept did not help. :((

----- Original Message ----- 
From: "Arno Garrels" <[EMAIL PROTECTED]>
To: "ICS support mailing" <twsocket@elists.org>
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" <twsocket@elists.org>
>> 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" <twsocket@elists.org>
>>>> 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

Reply via email to