sending a delegate through extern (C)

Etienne etcimon at gmail.com
Wed Mar 26 17:46:32 PDT 2014


Hi,

I'm trying to send a delegate to a modified version of druntime's GC as 
follows:

struct GC {
	static void onCollect(void* dg)
	{
		gc_onCollect(cast(void*)dg);
	}
...


my code:

	extern (C) extern __gshared void collecting(void* p, size_t sz){
		import std.stdio;
		writeln(p, sz);
	}

	GC.onCollect(cast(void*)&collecting);

and the caller in gc.d casts this to a function(void*, size_t) before 
sending the parameters.

I get the following:

object.Error: Access Violation
----------------
0x00536A9D in gc_onCollect
0x0051FA18 in D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv
0x0051F9EB in void rt.dmain2._d_run_main(int, char**, extern (C) int 
function(ch
ar[][])*).runAll()
0x0051F904 in _d_run_main
0x00446258 in main
0x0055C991 in mainCRTStartup
0x7513495D in BaseThreadInitThunk
0x770B98EE in RtlInitializeExceptionChain
0x770B98C4 in RtlInitializeExceptionChain
There are still tasks running at exit.
Error executing command run: Program exited with code 1

I'm wondering, why doesn't this execute the callback? I've tried many 
combinations of types but it looks like the pointer isn't accessible...

Thanks!


More information about the Digitalmars-d-learn mailing list