[erlang-questions] NIF resources, environments and GC

Sverker Eriksson sverker.eriksson@REDACTED
Tue Dec 19 16:33:24 CET 2017

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.


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,

More information about the erlang-questions mailing list