> On 5 May 2020, at 17:09, David Kastrup <d...@gnu.org> wrote: > > One reason is that we want to get rid of finalisers particularly in > connection with the Boehm GC. Finalisers are called when garbage is > collected, the collection of garbage is typically indicative of the > expected lifetime of our objects (there are a few that might be > unambiguously dead before), and thus it will cause C++ destructors to be > called. And those trigger, among other things, the deallocation of > memory resources, but we'd rather want the deallocation to be determined > by Scheme mechanisms and not have any resources in need of destruction > other than falling into oblivion.
For the GC objects, I use operator new/delete with an extra argument, the latter with empty body, wrapped in structure similar to std:shared_ptr. Then the memory resources of those objects are only handled by the GC, regardless of finalizers. > I've tried to come up with a clever callback scheme where the first use > of a structure causes fake nodes to be created with a "Pointer" type > that actually calls back with its address to its caller that then > constructs a layout of SCM elements within its governed class. However, > I have found no way to make this "parallel construction" where I could > then swap out this specific "Pointer" behavior for regular SCM. Similarly, it is necessary to call GC_INIT() on the first use on MacOS, which can happen before ‘main’ is called. So for that, I let operator new/delete call a function pointer which on the first call initializes, and also changes the pointer to the ordinary function pointer on future calls.