Yeah that's what I do. I think that's kind of the point of it, although I think most people use it perhaps as in-scope callbacks, whereas I persist the callbacks and invoke them later, so additionally I have to retain the wrapped closures to prevent them being collected.
On Wednesday, September 28, 2016 at 9:58:13 PM UTC+1, Cristóvão Duarte Sousa wrote: > > I can't help you at all, but I would like to ask if you pass > the cfunction() result to the C side. > I've been playing with embedding Julia and discovered I could call > a cfunction() directly from C, although I'm not sure that's a good > practice. > > https://github.com/cdsousa/embedding_julia/blob/master/embedding.cpp#L40 > > On Wednesday, September 28, 2016 at 5:22:49 PM UTC+1, Christian Rorvik > wrote: >> >> I'm not yet a 100% sure what is happening in my application, but I'm >> embedding Julia and using cfunction() to generate C-callable functions that >> at a later time invoke the registered julia code. I use a fairly standard >> pattern I think, of passing a pointer to a julia object that is retain in C >> and later passed down to the callback created by cfunction, and from there >> resolved to the original real Julia reference type, invoking a closure. The >> closure itself is retained in some global state to prevent garbage >> collection. What appears to be happening however, is the code at the >> landing site for the cfunction returned pointer is at some point garbage >> collection (or at least corrupted), as my program, after a while of >> running, will segfault upon invoking the callback (after many previously >> successful callbacks). It segfaults because it hits invalid code, and it's >> not that some state is missing when running the code. >> >> Is this to be be expected, and what's the right way to ensure the code >> isn't GC'd? >> >
