Are NIF resources meant to be destroyed immediately on GC?
José Valim <[email protected]>
| Newsgroups | gmane.comp.lang.erlang.general |
|---|---|
| Message-ID | <CAGnRm4+NP0yMiYFVEVzTbg0wAYLcv5v3Q0g_82HbZCE=oPcZiw@mail.gmail.com> |
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,