[erlang-questions] erlang nif resource & thread safety

Benoit Chesneau <>
Wed May 18 14:13:21 CEST 2016


On Mon, May 2, 2016 at 4:24 PM Sverker Eriksson <
> wrote:

> A resource will be deallocated when
>
> * all terms created with enif_make_resource() have been garbage collected
>
> * AND the call to enif_alloc_resource() has been balanced by a call to
> enif_release_resource()
>
> * AND all calls to enif_keep_resource() have been balanced by an equal
> number of calls to enif_release_resource()
>
>
>
> On 05/02/2016 11:47 AM, Benoit Chesneau wrote:
>
> I had a look in the doc but I can't figure exactly how much a nif resource
> could live outside the process that created it, ie. how others processes
> can write/read to it and how to make sure the resource will be accessible
> to them.
>
> So I created a nif resource that have the following properties:
> - it  is ref counted, each time a call is made to it, the counter is
> incremented and decremented when it return.
>
> A resource already has an internal ref counter, which is decremented by
> the GC and by enif_release_resource().
>
> Adding your own ref counter is probably either redundant or just plain
> wrong.
> Every call to enif_release_resource() must be balanced by a prior call
> to either enif_alloc_resource() or enif_keep_resource(). You cannot
> release a resource that is still referred to by one of more terms.
>
>
> - the process that create it will live until the vm is closed
>
> A resource it not tied to the process that created it,
> it is tied to the terms that refer it.
>

Related to that I recently came with the following question:
How to tie a nif resource to a owner process to make sure it's cleaned if
the process crash?

Looking at the source of ETS it seems to use unexposed functions from
https://github.com/erlang/otp/blob/maint/erts/emulator/beam/erl_process.h

I think I miss a C function like "nif_tie_resource(pid, somecalleback)" .
Or is there any code that already does that?

- benoît
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20160518/f4da0898/attachment.html>


More information about the erlang-questions mailing list