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

Reply via email to