|
@@ -144,7 +144,8 @@ begin
|
|
try
|
|
try
|
|
if LThread.FInitialSuspended then begin
|
|
if LThread.FInitialSuspended then begin
|
|
SemaphoreWait(LThread.FSem);
|
|
SemaphoreWait(LThread.FSem);
|
|
- if not LThread.FInitialSuspended then begin
|
|
|
|
|
|
+ if not LThread.FSuspended then begin
|
|
|
|
+ LThread.FInitialSuspended := false;
|
|
WRITE_DEBUG('going into LThread.Execute');
|
|
WRITE_DEBUG('going into LThread.Execute');
|
|
LThread.Execute;
|
|
LThread.Execute;
|
|
end;
|
|
end;
|
|
@@ -257,21 +258,20 @@ procedure TThread.Resume;
|
|
begin
|
|
begin
|
|
if (not FSuspendedExternal) then begin
|
|
if (not FSuspendedExternal) then begin
|
|
if FSuspended then begin
|
|
if FSuspended then begin
|
|
- SemaphorePost(FSem);
|
|
|
|
- FInitialSuspended := false;
|
|
|
|
FSuspended := False;
|
|
FSuspended := False;
|
|
|
|
+ SemaphorePost(FSem);
|
|
end;
|
|
end;
|
|
end else begin
|
|
end else begin
|
|
|
|
+ FSuspendedExternal := false;
|
|
{$IFDEF LINUX}
|
|
{$IFDEF LINUX}
|
|
// see .Suspend
|
|
// see .Suspend
|
|
if FPid <> GMainPID then begin
|
|
if FPid <> GMainPID then begin
|
|
- fpkill(FPid, SIGCONT);
|
|
|
|
FSuspended := False;
|
|
FSuspended := False;
|
|
|
|
+ fpkill(FPid, SIGCONT);
|
|
end;
|
|
end;
|
|
{$ELSE}
|
|
{$ELSE}
|
|
ResumeThread(FHandle);
|
|
ResumeThread(FHandle);
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
- FSuspendedExternal := false;
|
|
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -321,7 +321,17 @@ end;
|
|
|
|
|
|
{
|
|
{
|
|
$Log$
|
|
$Log$
|
|
- Revision 1.13 2005-02-25 21:41:09 florian
|
|
|
|
|
|
+ Revision 1.14 2005-03-01 20:38:49 jonas
|
|
|
|
+ * fixed web bug 3387: if one called resume right after creating a
|
|
|
|
+ suspended thread, it was possible that resume was executed before
|
|
|
|
+ that thread had completed its initialisation in BeginThread ->
|
|
|
|
+ FInitialSuspended was set to false in resume and nevertheless a
|
|
|
|
+ semafore was posted
|
|
|
|
+ * second problem fixed: set FSuspended to false before waking up the
|
|
|
|
+ thread, so that it doesn't get FSuspended = true right after waking
|
|
|
|
+ up. This should be done atomically to be completely correct though.
|
|
|
|
+
|
|
|
|
+ Revision 1.13 2005/02/25 21:41:09 florian
|
|
* generic tthread.synchronize
|
|
* generic tthread.synchronize
|
|
* delphi compatible wakemainthread
|
|
* delphi compatible wakemainthread
|
|
|
|
|