mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 14:09:17 +02:00
* fixed wrong freeing of system threads when a tthread is freed
(first threadfunc would call endthread -> detach+pthread exit, and then tthread.destroy would waitfor -> pthread_join for this pthread, while you cannot join a detached thread) * cleaned up freeing an InitiallySuspended thread git-svn-id: trunk@3889 -
This commit is contained in:
parent
6ed96fd8ad
commit
92c7553818
@ -175,9 +175,10 @@ begin
|
|||||||
WRITE_DEBUG('Thread should be freed');
|
WRITE_DEBUG('Thread should be freed');
|
||||||
LThread.Free;
|
LThread.Free;
|
||||||
WRITE_DEBUG('Thread freed');
|
WRITE_DEBUG('Thread freed');
|
||||||
|
// tthread.destroy already frees all things and terminates the thread
|
||||||
|
// WRITE_DEBUG('thread func calling EndThread');
|
||||||
|
// EndThread(Result);
|
||||||
end;
|
end;
|
||||||
WRITE_DEBUG('thread func calling EndThread');
|
|
||||||
EndThread(Result);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TThread }
|
{ TThread }
|
||||||
@ -207,18 +208,18 @@ begin
|
|||||||
// if someone calls .Free on a thread with
|
// if someone calls .Free on a thread with
|
||||||
// FreeOnTerminate, then don't crash!
|
// FreeOnTerminate, then don't crash!
|
||||||
FFreeOnTerminate := false;
|
FFreeOnTerminate := false;
|
||||||
if not FFinished and not FSuspended then begin
|
if (FInitialSuspended) then
|
||||||
Terminate;
|
|
||||||
WaitFor;
|
|
||||||
end;
|
|
||||||
if (FInitialSuspended) then begin
|
|
||||||
// thread was created suspended but never woken up.
|
// thread was created suspended but never woken up.
|
||||||
SemaphorePost(FSem);
|
Resume;
|
||||||
WaitFor;
|
if not FFinished and not FSuspended then
|
||||||
end;
|
begin
|
||||||
|
Terminate;
|
||||||
|
WaitFor;
|
||||||
|
end;
|
||||||
FFatalException.Free;
|
FFatalException.Free;
|
||||||
FFatalException := nil;
|
FFatalException := nil;
|
||||||
SemaphoreDestroy(FSem);
|
SemaphoreDestroy(FSem);
|
||||||
|
{ threadvars have been released by cthreads.ThreadMain -> DoneThread }
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user