Are NIF resources meant to be destroyed immediately on GC?

José Valim jose.valim@REDACTED
Mon Nov 23 20:24:16 CET 2020


Hi everyone,

We are working on some code that allocates large chunks of memory inside a
NIF and ties them to a resource (using enif_alloc_resource +
enif_make_resource). While running some tests, I noticed that we were
holding onto these resources for longer than we wanted to, so we have added
calls to erlang:garbage_collect/1. In a nutshell, the code looks like this:

my_nif:function_allocates_large_memory(),
erlang:garbage_collect(),
my_nif:check_if_resource_has_been_destroyed().

In our runs, it seems that the resource has not yet been destroyed in most
cases. However, if we do add a sleep after garbage collection, then the
odds of it being destroyed increases as we increase the sleep interval.

Is this correct? Even if the resource was garbage collected, the destructor
may not have been called? Or is this actually a big in our software that we
should look deeper into?

Thank you,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20201123/516d2bda/attachment.htm>


More information about the erlang-questions mailing list