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?
>>
>

Reply via email to