Mark Rogers wrote:
> I am however getting EAccessViolation exceptions when shutting down my
> application if any web requests have been made, presumably because a
> thread servicing web requests has not been terminated. (The exception
> gets triggered in TExecLoop.Execute.)
>
Looking into this in more detail, it seems that if I have my instance of
TSynHttpServer (which is derived from TSynTcpServer) set with
SpareThreads>0, then threads which do not die (eg by timing out) do not
get freed and cause the access violation and a memory leak.
The relevant code seems to be this (below) code from SynSrv.pas
(function TSynTcpServer.ExecuteConnThread).
If FSpareThreads > 0 then it appears that some management of existing
threads takes place (via FThreadPool), although at this point there are
no existing threads so nothing happens, and then a new thread is created
(Loop:=TExecLoop.Create) but nowhere does it seem to be added into
FThreadPool?
I know that Synapse HTTP is not part of Synapse but hopefully someone
here is using it or can help me fix this.
procedure TSynTcpServer.ExecuteConnThread(const Method:
TNotifyEvent; var aThreadId: Cardinal);
var Loop: TExecLoop;
i: integer;
begin
if not Assigned(Method) then
exit;
if (FSpareThreads<=0) then begin
// Do not use spare-threads...
with TSynThread.Create(True,Method) do begin
aThreadId:=ThreadId;
Resume;
end;
exit;
end;
//
// Get spare waiting thread:
Loop:=nil;
with FThreadPool.LockList do try
i:=Count;
while (i>0) do begin
dec(i);
Loop:=Items[i];
if Loop.Thread.Suspended then begin
Remove(Loop);
break;
end;
// we could catch it between UnlockList and Suspend in
DoThreadWaiting...
Loop:=nil;
end;
finally
FThreadPool.UnlockList;
end;
//
if (Loop=nil) then begin
// Start new thread:
Loop:=TExecLoop.Create;
Loop.OnThreadWaiting:=Self.DoThreadWaiting;
Loop.FThread:=TSynThread.Create(True,Loop.Execute);
end;
Loop.CurrentExec:=Method;
aThreadId:=Loop.Thread.ThreadId;
Loop.Thread.Resume;
end;
--
Mark Rogers // More Solutions Ltd (Peterborough Office) // 0845 45 89 555
Registered in England (0456 0902) at 13 Clarke Rd, Milton Keynes, MK1 1LG
--
Mark Rogers // More Solutions Ltd (Peterborough Office) // 0845 45 89 555
Registered in England (0456 0902) at 13 Clarke Rd, Milton Keynes, MK1 1LG
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
synalist-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synalist-public