On Saturday, 28 June 2025 at 08:11:53 UTC, realhet wrote:
On Thursday, 26 June 2025 at 16:40:10 UTC, Steven Schveighoffer wrote:
On Tuesday, 24 June 2025 at 08:48:16 UTC, realhet wrote:

For those who run into this problem: These are really illegal things in the destructors:
- GC allocation.
- synchronize() block when it contains a secret hidden GC allocation. This can enter into a freezing state, as the hidden mutex object will never be created. (just my speculation)

So for the unlimited sized linked list I used the help of AI to make me a freeList and use core.stdc.alloc() and free(). (I normally don't like that AI LLMs, are coding in DLang in low level C style, not using the high level D functional goodies, but this time it was a perfect job for it.)

And for the synchronized() block: Now because in put() the buffer can be replaced when it's growing, I use synchronized(this) both in put() and fetch(). And in the constructor, I do this:
```d
synchronized(this) { asm{ nop; }}
```
This is the very first synch block for 'this' and it does a GC allocation. That must NOT happen inside the destructor.


From now I will have a 100% guarantee that the resource (Texture handles in my case) will not leak. And it's guaranteed by the GC fully automatically. And if I want to do it nicely I can call destroy manually from any thread.

Reply via email to