Re: [julia-users] Replacement for jl_gc_preserve() and jl_gc_unpreserve()?
Thanks for those ideas Bart. I think I will try stashing an index into the array in the smart pointer (along side the pointer) and use your idea of a stack of indices to the available null entries. I'm currently working on embedding v8 for comparison purposes, so I won't do this immediately. On Wednesday, August 10, 2016 at 11:06:23 PM UTC+12, Bart Janssens wrote: > > On Wed, Aug 10, 2016 at 11:46 AM Kit Adams> wrote: > >> Thank you for those links, they are a great help. >> >> Is there an "unprotect_from_gc(T* val)"? >> >> I am looking for a smart pointer a bit like v8's UniquePersistent<>. >> >> I guess I could make one that searched through the array for the value in >> order to remove it (in the smart pointer's dtor). >> >> > No, I didn't need unprotect so far. Iterating over the array is one way, > another option would be to keep a std::map along with the array to > immediately find the index. I think removing elements from the array is > cumbersome, it's probably best to set the value to null (by assigning a > jl_box_voidpointer(nullptr), setting a jl_value_t* to null directly feels > wrong) and depending on how many times objects are added / removed keep a > stack of the empty spots in the array so they can be reused. > >
Re: [julia-users] Replacement for jl_gc_preserve() and jl_gc_unpreserve()?
On Wed, Aug 10, 2016 at 11:46 AM Kit Adamswrote: > Thank you for those links, they are a great help. > > Is there an "unprotect_from_gc(T* val)"? > > I am looking for a smart pointer a bit like v8's UniquePersistent<>. > > I guess I could make one that searched through the array for the value in > order to remove it (in the smart pointer's dtor). > > No, I didn't need unprotect so far. Iterating over the array is one way, another option would be to keep a std::map along with the array to immediately find the index. I think removing elements from the array is cumbersome, it's probably best to set the value to null (by assigning a jl_box_voidpointer(nullptr), setting a jl_value_t* to null directly feels wrong) and depending on how many times objects are added / removed keep a stack of the empty spots in the array so they can be reused.
Re: [julia-users] Replacement for jl_gc_preserve() and jl_gc_unpreserve()?
I guess I could try using std::remove() followed by jl_array_del_end() to remove entries. Cheers, Kit On Wednesday, August 10, 2016 at 9:45:55 PM UTC+12, Kit Adams wrote: > > Thank you for those links, they are a great help. > > Is there an "unprotect_from_gc(T* val)"? > > I am looking for a smart pointer a bit like v8's UniquePersistent<>. > > I guess I could make one that searched through the array for the value in > order to remove it (in the smart pointer's dtor). > > Thanks, > Kit > > > On Wednesday, August 10, 2016 at 8:10:34 PM UTC+12, Bart Janssens wrote: >> >> >> >> On Wed, Aug 10, 2016 at 9:11 AM Yichao Yuwrote: >> >>> On Wed, Aug 10, 2016 at 2:17 PM, Kit Adams wrote: >>> I am investigating the feasibility of embedding Julia in a C++ real-time signal processing framework, using Julia-0.4.6 (BTW, the performance is looking amazing). However, for this usage I need to retain Julia state variables across c++ function calls, so the stack based JL_GC_PUSH() and JL_GC_POP() are not sufficient. When I injected some jl_gc_collect() calls for testing purposes, to simulate having multiple Julia scripts running (from the same thread), I got crashes, which I was able to fix using e.g. jl_gc_preserve(mMyState); and appropriate matching jl_gc_unpreserve() calls. I see these functions have been removed from the latest Julia version. Is there an alternative that allows Julia values to be retained in a C++ app across gc calls? >>> >>> Copy from my reply on github >>> >>> > This never works in the way you think it did. For keeping a value >>> live, put it in a rooted global array. >>> >>> >>> >> I'm not saying this is the best way to implement Yichao's suggestion, but >> here is how it's done in CxxWrap.jl: >> >> https://github.com/barche/CxxWrap.jl/blob/master/deps/src/cxx_wrap/type_conversion.hpp#L27-L38 >> >> The array is allocated and rooted using jl_set_const here: >> >> https://github.com/barche/CxxWrap.jl/blob/master/deps/src/cxx_wrap/cxx_wrap.cpp#L14-L28 >> >> Cheers, >> >> Bart >> >
Re: [julia-users] Replacement for jl_gc_preserve() and jl_gc_unpreserve()?
Thank you for those links, they are a great help. Is there an "unprotect_from_gc(T* val)"? I am looking for a smart pointer a bit like v8's UniquePersistent<>. I guess I could make one that searched through the array for the value in order to remove it (in the smart pointer's dtor). Thanks, Kit On Wednesday, August 10, 2016 at 8:10:34 PM UTC+12, Bart Janssens wrote: > > > > On Wed, Aug 10, 2016 at 9:11 AM Yichao Yu> wrote: > >> On Wed, Aug 10, 2016 at 2:17 PM, Kit Adams > > wrote: >> >>> I am investigating the feasibility of embedding Julia in a C++ real-time >>> signal processing framework, using Julia-0.4.6 (BTW, the performance is >>> looking amazing). >>> >>> However, for this usage I need to retain Julia state variables across >>> c++ function calls, so the stack based JL_GC_PUSH() and JL_GC_POP() are not >>> sufficient. >>> When I injected some jl_gc_collect() calls for testing purposes, to >>> simulate having multiple Julia scripts running (from the same thread), I >>> got crashes, which I was able to fix using e.g. jl_gc_preserve(mMyState); >>> and appropriate matching jl_gc_unpreserve() calls. >>> >>> I see these functions have been removed from the latest Julia version. >>> >>> Is there an alternative that allows Julia values to be retained in a C++ >>> app across gc calls? >>> >> >> Copy from my reply on github >> >> > This never works in the way you think it did. For keeping a value live, >> put it in a rooted global array. >> >> >> > I'm not saying this is the best way to implement Yichao's suggestion, but > here is how it's done in CxxWrap.jl: > > https://github.com/barche/CxxWrap.jl/blob/master/deps/src/cxx_wrap/type_conversion.hpp#L27-L38 > > The array is allocated and rooted using jl_set_const here: > > https://github.com/barche/CxxWrap.jl/blob/master/deps/src/cxx_wrap/cxx_wrap.cpp#L14-L28 > > Cheers, > > Bart >
Re: [julia-users] Replacement for jl_gc_preserve() and jl_gc_unpreserve()?
On Wed, Aug 10, 2016 at 9:11 AM Yichao Yuwrote: > On Wed, Aug 10, 2016 at 2:17 PM, Kit Adams wrote: > >> I am investigating the feasibility of embedding Julia in a C++ real-time >> signal processing framework, using Julia-0.4.6 (BTW, the performance is >> looking amazing). >> >> However, for this usage I need to retain Julia state variables across c++ >> function calls, so the stack based JL_GC_PUSH() and JL_GC_POP() are not >> sufficient. >> When I injected some jl_gc_collect() calls for testing purposes, to >> simulate having multiple Julia scripts running (from the same thread), I >> got crashes, which I was able to fix using e.g. jl_gc_preserve(mMyState); >> and appropriate matching jl_gc_unpreserve() calls. >> >> I see these functions have been removed from the latest Julia version. >> >> Is there an alternative that allows Julia values to be retained in a C++ >> app across gc calls? >> > > Copy from my reply on github > > > This never works in the way you think it did. For keeping a value live, > put it in a rooted global array. > > > I'm not saying this is the best way to implement Yichao's suggestion, but here is how it's done in CxxWrap.jl: https://github.com/barche/CxxWrap.jl/blob/master/deps/src/cxx_wrap/type_conversion.hpp#L27-L38 The array is allocated and rooted using jl_set_const here: https://github.com/barche/CxxWrap.jl/blob/master/deps/src/cxx_wrap/cxx_wrap.cpp#L14-L28 Cheers, Bart
Re: [julia-users] Replacement for jl_gc_preserve() and jl_gc_unpreserve()?
On Wed, Aug 10, 2016 at 2:17 PM, Kit Adamswrote: > I am investigating the feasibility of embedding Julia in a C++ real-time > signal processing framework, using Julia-0.4.6 (BTW, the performance is > looking amazing). > > However, for this usage I need to retain Julia state variables across c++ > function calls, so the stack based JL_GC_PUSH() and JL_GC_POP() are not > sufficient. > When I injected some jl_gc_collect() calls for testing purposes, to > simulate having multiple Julia scripts running (from the same thread), I > got crashes, which I was able to fix using e.g. jl_gc_preserve(mMyState); > and appropriate matching jl_gc_unpreserve() calls. > > I see these functions have been removed from the latest Julia version. > > Is there an alternative that allows Julia values to be retained in a C++ > app across gc calls? > Copy from my reply on github > This never works in the way you think it did. For keeping a value live, put it in a rooted global array.
[julia-users] Replacement for jl_gc_preserve() and jl_gc_unpreserve()?
I am investigating the feasibility of embedding Julia in a C++ real-time signal processing framework, using Julia-0.4.6 (BTW, the performance is looking amazing). However, for this usage I need to retain Julia state variables across c++ function calls, so the stack based JL_GC_PUSH() and JL_GC_POP() are not sufficient. When I injected some jl_gc_collect() calls for testing purposes, to simulate having multiple Julia scripts running (from the same thread), I got crashes, which I was able to fix using e.g. jl_gc_preserve(mMyState); and appropriate matching jl_gc_unpreserve() calls. I see these functions have been removed from the latest Julia version. Is there an alternative that allows Julia values to be retained in a C++ app across gc calls?