digitalmars.D.learn - sending a delegate through extern (C)
- Etienne (36/36) Mar 26 2014 Hi,
- Andrej Mitrovic (3/11) Apr 13 2014 There isn't enough information here to extract what's going on in
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!
Mar 26 2014
On Thursday, 27 March 2014 at 00:46:33 UTC, Etienne wrote: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); }There isn't enough information here to extract what's going on in your code.
Apr 13 2014