Are NIF resources meant to be destroyed immediately on GC?

Michael Truog mjtruog@REDACTED
Mon Nov 23 21:13:00 CET 2020


On 11/23/20 11:24 AM, José Valim wrote:
> 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?
Hi José,

You are suppose to tie the lifetime of the resource to the lifetime of 
an Erlang process to let the garbage collection happen more naturally.  
That should make the problem disappear.  An example of making the 
garbage collection as fast as possible is at 
https://gist.github.com/okeuday/dee991d580eeb00cd02c (immediate_gc 
module) but it is best to not use erlang:garbage_collect/0.

Best Regards,
Michael

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20201123/a123f89f/attachment.htm>


More information about the erlang-questions mailing list