|
@@ -362,8 +362,18 @@ procedure TThread.DoneSynchronizeEvent;
|
|
class procedure TThread.Synchronize(AThread: TThread; AMethod: TThreadMethod);
|
|
class procedure TThread.Synchronize(AThread: TThread; AMethod: TThreadMethod);
|
|
var
|
|
var
|
|
syncentry: PThreadQueueEntry;
|
|
syncentry: PThreadQueueEntry;
|
|
|
|
+ thread: TThread;
|
|
begin
|
|
begin
|
|
- if not Assigned(AThread) then begin
|
|
|
|
|
|
+{$ifdef FPC_HAS_FEATURE_THREADING}
|
|
|
|
+ if Assigned(AThread) and (AThread.ThreadID = GetCurrentThreadID) then
|
|
|
|
+{$else}
|
|
|
|
+ if Assigned(AThread) then
|
|
|
|
+{$endif}
|
|
|
|
+ thread := AThread
|
|
|
|
+ else if Assigned(CurrentThreadVar) then
|
|
|
|
+ thread := CurrentThreadVar
|
|
|
|
+ else begin
|
|
|
|
+ thread := Nil;
|
|
{ use a local synchronize event }
|
|
{ use a local synchronize event }
|
|
New(syncentry);
|
|
New(syncentry);
|
|
FillChar(syncentry^, SizeOf(TThreadQueueEntry), 0);
|
|
FillChar(syncentry^, SizeOf(TThreadQueueEntry), 0);
|
|
@@ -374,11 +384,13 @@ class procedure TThread.Synchronize(AThread: TThread; AMethod: TThreadMethod);
|
|
syncentry^.ThreadID := 0{GetCurrentThreadID};
|
|
syncentry^.ThreadID := 0{GetCurrentThreadID};
|
|
syncentry^.SyncEvent := nil{RtlEventCreate};
|
|
syncentry^.SyncEvent := nil{RtlEventCreate};
|
|
{$endif}
|
|
{$endif}
|
|
- end else begin
|
|
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ if Assigned(thread) then begin
|
|
{ the Synchronize event is instantiated on demand }
|
|
{ the Synchronize event is instantiated on demand }
|
|
- AThread.InitSynchronizeEvent;
|
|
|
|
|
|
+ thread.InitSynchronizeEvent;
|
|
|
|
|
|
- syncentry := AThread.FSynchronizeEntry;
|
|
|
|
|
|
+ syncentry := thread.FSynchronizeEntry;
|
|
end;
|
|
end;
|
|
|
|
|
|
syncentry^.Exception := Nil;
|
|
syncentry^.Exception := Nil;
|
|
@@ -388,7 +400,7 @@ class procedure TThread.Synchronize(AThread: TThread; AMethod: TThreadMethod);
|
|
syncentry^.Method := Nil;
|
|
syncentry^.Method := Nil;
|
|
syncentry^.Next := Nil;
|
|
syncentry^.Next := Nil;
|
|
|
|
|
|
- if not Assigned(AThread) then begin
|
|
|
|
|
|
+ if not Assigned(thread) then begin
|
|
{ clean up again }
|
|
{ clean up again }
|
|
{$ifdef FPC_HAS_FEATURE_THREADING}
|
|
{$ifdef FPC_HAS_FEATURE_THREADING}
|
|
RtlEventDestroy(syncentry^.SyncEvent);
|
|
RtlEventDestroy(syncentry^.SyncEvent);
|