Thanks, Yichao!
On Tuesday, February 16, 2016 at 8:55:29 PM UTC+1, Yichao Yu wrote: > > > On Feb 16, 2016 2:38 PM, "Oliver Schulz" <[email protected] > <javascript:>> wrote: > > > > Hello, > > > > I realized that this question is probably not specific to Cxx.jl, but > concerns Julia's garbage collection in general: Is it save to keep a > pointer to a Julia-owned object in an FFI environment (e.g. from C), as > long as the object is not GC'ed? From what I saw, the current Julia garbage > collector is non-moving. Should I be prepared for Julia to switch to a > moving/compacting GC in the foreseeable future, or is a next-generation GC > for Julia likely to be non-moving as well? > > We'd like to try out moving but even if it is implemented, we will > definitely have a relatively easy way to pin the object. > > > > > > > Cheers, > > > > Oliver > > > > > > On Thursday, February 11, 2016 at 1:09:44 PM UTC+1, Oliver Schulz wrote: > >> > >> Hi, > >> > >> is the memory address (seen from C++) of objects created via `@cxx > SomeClass()` (or similar) stable over time (GC cycles)? > >> > >> I need to use a container class whose elements keep a pointer to the > container itself. I want Julia to own the container, so it should be > subject to garbage collection. The container owns it's elements and deletes > them on destruction, so they can't outlive the container object. But > obviously, the address of the container object must not change over time, > else things will break. So is it safe to do > >> > >> container = @cxx Container() > >> > >> or > >> > >> container = icxx""" Container(); """ > >> > >> Or do I need to do something like > >> > >> container = icxx""" std::unique_ptr<Container>(new Container); """ > >> > >> I would assume that "container.data" moves around during GC cycles, so > that `icxx""" &$container """` wouldn't be stable over GC cycles. But this > little test seems to indicate that it actually may be stable: > >> > >> cxx""" > >> struct MyContainer { > >> MyContainer* m_origAddr; > >> MyContainer* origAddr() { return m_origAddr; } > >> MyContainer* currAddr() { return this; } > >> bool checkAddr() { return currAddr() == origAddr(); } > >> MyContainer() { m_origAddr = this; } > >> }; > >> """ > >> > >> typealias MyContainer > cxxt"MyContainer"{Int(icxx"""sizeof(MyContainer);""")} > >> > >> rndarray = rand(1000,1000,100) > >> > >> containers = Vector{MyContainer}() > >> for i in 1:20000000 push!(containers, @cxx MyContainer()) end > >> assert(all(x -> icxx""" $x.checkAddr(); """, containers)) > >> > >> rndarray = rand(10,10,10) > >> gc() > >> > >> assert(all(x -> icxx""" $x.checkAddr(); """, containers)) > >> > >> Keno, help ... ? ;-) > >> > >> > >> Cheers, > >> > >> Oliver > >> >
