[erlang-questions] NIF resources, environments and GC
Loïc Hoguin
essen@REDACTED
Tue Dec 19 16:03:06 CET 2017
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,
--
Loïc Hoguin
https://ninenines.eu
More information about the erlang-questions
mailing list