[erlang-questions] Deterministic destruction of NIF resources

Loïc Hoguin essen@REDACTED
Mon Jul 18 11:38:31 CEST 2016

Wow, nice tip!

Wonder if anything can be done to fix it? Perhaps the repl can check if 
a variable is/contains a resource and replace it with <<>> for further 
usage? Can that be done?

On 07/18/2016 10:30 AM, John Doe wrote:
> They are often held by the repl. If one prints an allocated resource in
> Erlang console it won't be released.
> 2016-07-17 10:37 GMT+03:00 Lukas Larsson <garazdawi@REDACTED
> <mailto:garazdawi@REDACTED>>:
>     On Sat, Jul 16, 2016 at 10:06 AM, Roger Lipscombe
>     <roger@REDACTED <mailto:roger@REDACTED>> wrote:
>         In my testing, the destructor is delayed by a few seconds (when
>         repeatedly -- manually, so not particularly quickly --
>         restarting one
>         test process). In production, we're seeing the destructor being
>         delayed an arbitrarily long period, which is kinda important,
>         because
>         the destructor is responsible for killing a background thread, and
>         we'd prefer it not to continue after the associated Erlang
>         process has
>         died.
>         As far as I can tell from reading the OTP source, it looks like
>         resources are allocated from the binary heap, rather than any
>         particular process heap, which suggests to me that they'll be
>         collected when the binary heap undergoes a GC. What triggers that?
>     The binary heap never undergoes a gc, there is just the term heap
>     gc. The binaries (which as you say include nif resources) are
>     reference counted and de-allocated when all references are gone. I
>     can't say for sure why your references are being held on for longer,
>     if you want to dig deeper:
>     * the sweep of the binaries is
>     here: https://github.com/erlang/otp/blob/maint/erts/emulator/beam/erl_process.c#L11674
>     * the deletion of the process is
>     here: https://github.com/erlang/otp/blob/maint/erts/emulator/beam/erl_process.c#L12857
>     * the calling of the destructor is done by erts_bin_free here:
>     https://github.com/erlang/otp/blob/maint/erts/emulator/beam/erl_message.c#L171
>     One of the great mantras of ERTS is "Why do it now when it would be
>     cheaper/easier to do it later". So it may well be that something
>     somewhere along the path delays and batches all the operations up.
>     As Max says, in order to be sure when the release will happen.
>     Release all references in the code and manually call the GC.
>     Lukas
>     _______________________________________________
>     erlang-questions mailing list
>     erlang-questions@REDACTED <mailto:erlang-questions@REDACTED>
>     http://erlang.org/mailman/listinfo/erlang-questions
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions

Loïc Hoguin
Author of The Erlanger Playbook,
A book about software development using Erlang

More information about the erlang-questions mailing list