Delegates and C++ FFI lifetimes

IGotD- nise at nise.com
Thu Jul 2 16:24:11 UTC 2020


I have this runtime written in C++ that allows callbacks for 
various functionality. In C++ the callbacks are stored as a 
function pointer together with a void* that is passed as first 
argument. The void* can be a lot of things, for example the class 
pointer in C++. However, this is a bit limited for D and the 
question is if you can use the void* in order to store a pointer 
to a D delegate instead. A trampoline function just casts the 
void* to a delegate and you go from there.

Basically:

class TestClass
{
     void test() { writeln("test"); }
}

void Setup()
{
     auto t = new TestClass;
     MyCallbackSystem s = CreateCallbackSystem(); // C++ FFI 
interface
     s.SetCallback(&t.test); // SetCallback, a helper function for 
MyCallbackSystem
}

Where SetCallback accepts a D delegate. Now this delegate is 
completely scoped and will likely disappear when SetCallback 
ends. The void* where the delegate is stored is of course 
completely outside the knowledge of the GC. I assume this leads 
to that the C++ runtime will read an invalid pointer.

The question how can you best solve this so that the delegates 
lives as long as the object (s) associated with SetCallback. Can 
you actually dynamically in D allocate a delegate? I've never 
seen such idiom other than this thread

https://forum.dlang.org/thread/20080201213313.GB9684@homero.springfield.home

where the workaround seems to be having a delegate in a struct.





More information about the Digitalmars-d-learn mailing list