Re: [julia-users] Replacement for jl_gc_preserve() and jl_gc_unpreserve()?

2016-08-10 Thread Kit Adams
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()?

2016-08-10 Thread Bart Janssens
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()?

2016-08-10 Thread Kit Adams
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 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()?

2016-08-10 Thread Kit Adams
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()?

2016-08-10 Thread Bart Janssens
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()?

2016-08-10 Thread Yichao Yu
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.


[julia-users] Replacement for jl_gc_preserve() and jl_gc_unpreserve()?

2016-08-10 Thread Kit Adams
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?