[erlang-questions] NIF resources, environments and GC

Loïc Hoguin essen@REDACTED
Tue Dec 19 16:41:58 CET 2017

Thanks for the tip, I haven't tried that. I'll report back with the results.

On 12/19/2017 04:33 PM, Sverker Eriksson wrote:
> Two resource terms will compare equal (in OTP-20) iff they yield
> the same pointer from enif_get_resource().
> So, isn't the solution to instead maintain a pointer to your resource
> in the static variable. Call enif_make_resource(static_ptr) when you
> need to return a resource term.
> And then clear that static pointer in the destructor.
> /Sverker
> On tis, 2017-12-19 at 16:03 +0100, Loïc Hoguin wrote:
>> Hello,
>> I've got the following situation.
>> I have a function SDL_CreateWindow that returns an SDL_Window* from
>> which I create a resource with a destructor which is called when the
>> resource variable gets GC'd. So far so good.
>> I also have various other functions which may return the same
>> SDL_Window* as the one that was created earlier. In this case I want
>> to
>> return the same resource so that it is possible to match or compare
>> the
>> resources on the latest Erlang versions so that users can confirm
>> that
>> yes, it's the same window. This is useful to know for example to
>> know
>> which window currently has focus.
>> I therefore need to keep the ERL_NIF_TERM around along with
>> SDL_Window*
>> since recreating the term would lead to different references and
>> comparisons failing. I've therefore proceded to use enif_make_copy
>> to
>> copy it to a static variable and I do enif_make_copy again when I
>> need
>> to return it.
>> It works.
>> Almost.
>> The only issue with my approach is that the destructor for the
>> SDL_Window* resource no longer gets called. Apparently enif_make_copy
>> is
>> the culprit. As soon as I copy the resource term to my private env,
>> the
>> destructor stops being called.
>> Is there any way I can keep this resource term while still
>> benefitting
>> from the destructor being called when the variable is discarded?
>> Basically I would like the private copy to not be reference counted.
>> Any
>> way to do this?
>> Thanks,
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions

Loïc Hoguin

More information about the erlang-questions mailing list