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

Reply via email to