Fastream Technologies wrote:
> MadExcept did not help. :((

Yes, if the exception is handled by HandleBackGroundException() 
MadExcept would not catch it.
But temporarily commenting Try, Except up to End in a few WndProc
procedures will make it work.

---
Arno Garrels [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html


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