[fpc-pascal] changes in TThread.OnTerminate in fcp-3.0?

Luca Olivetti luca at ventoso.org
Thu Dec 10 11:57:22 CET 2015


El 10/12/15 a les 11:13, Sven Barth ha escrit:
> Am 10.12.2015 11:05 schrieb "Luca Olivetti" <luca at ventoso.org
> <mailto:luca at ventoso.org>>:
>  >
>  > Hello,
>  >
>  > in a couple of programs I'm using this idiom:
>  >
>  >
>  > FMyThread:=TMyTread.Create;
>  > FMyThread.FreeOnTerminate:=false;
>  > FMyThread.OnTerminate:=@MyThreadTerminate
>  >
>  > procedure TMyForm.MyThreadTerminate(Sender:TObject);
>  > begin
>  >   //do something with FMyThread then
>  >   FreeAndNil(FMyThread);
>  > end;
>  >
>  >
>  > With fpc 2.6.4 it worked flawlessly, with fpc 3.0 sometimes it causes
> a sigsev somewhere inside CheckSynchronize.
>  >
>  > I could find nothing here
>  > http://wiki.freepascal.org/User_Changes_3.0
>  > related to this.
>  > I realize that's an implementation detail so probably what I did was
> wrong (was it?).
>
> I'd need to check what the RTL does after OnTerminate is called, but it
> could be that this worked by chance...

Yes and no: OnTerminate is called via Synchronize. In 2.6.4 there could 
be only one outstanding synchronized method and CheckSynchronize 
wouldn't access the thread after calling it, so freeing the thread 
inside OnTerminate was no problem.

Now it's been changed to use a queue of waiting methods, and 
CheckSynchronize, after calling the method, calls

    RtlEnventSetEvent(tmpentry^.SyncEvent)

where SyncEvent is a member of the thread, and if the thread has already 
been freed that's going to bomb.

It's obvious that you cannot free the thread from inside a "normal" 
Synchronize call, it's no so obvious you cannot do it in the OnTerminate 
method, so maybe a note could be added in

http://wiki.freepascal.org/User_Changes_3.0

The new implementation is clearly better....once you know *not* to free 
the thread inside OnTerminate.


Bye
-- 
Luca



More information about the fpc-pascal mailing list