[fpc-pascal] Question: Is there a global callback, when a thread gets terminated?
Martin Frb
lazarus at mfriebe.de
Tue Feb 12 17:26:28 CET 2019
On 11/02/2019 11:21, Michael Schnell wrote:
>> Yes, but how do I get notified, when the thread is gone, and I can free the
>> memory (of the object that was created)?
> Ah, now I finally see the problem :)
>
> The only idea that comes in my mind is creating yet another thread or a TTimer (by means of "QueueAsyncCall") to poll if the original Threads still living. This supposedly would involve OS calls for getting the thread ID and for checking same for validity. Ugly ! :( .
>
Then I may as well "hack" the memory manager.
Just wanted to see, if there was anything better. Given that
MemManager.DoneThread exists, it should be possible to add a feature. Is
that a plausible request?
I believe writing and installing your own memory manager is a documented
feature, so the following steps should be future save.
(unless something else install yet another mem manager after this. But
since at that stage, code is already running and allocating memory, that
should have happened before)
var
CurMemMgr: TMemoryManager;
CurDoneThreat: procedure;
threadvar
logger: TMyThreadLogger; // might be created by each thread
procedure MyDoneThread;
begin
Logger.Free;
CurDoneThreat();
end;
GetMemoryManager(CurMemMgr);
CurDoneThreat := CurMemMgr.DoneThread;
CurMemMgr.DoneThread := MyDoneThread;
SetMemoryManager(CurMemMgr);
It is not the "nicest" solution but should work.
What I still need to find out is:
- Is DoneThread called under every OS/platform?
but if not, it is not fatal, just a leak. Would be good to be able to
have some IFDEF in this case (eg not create logger)
- Is DoneThread called inside the thread? or otherwise with access to
the correct threadvar "logger" instance?
and is that so on all OS/platform. (I can add tests, to protect
against freeing the main threads object)
More information about the fpc-pascal
mailing list