* 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:
Jonas Maebe 2006-06-18 12:35:44 +00:00
parent 6ed96fd8ad
commit 92c7553818

View File

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