thanks! the current behaviour is what i anted, though indeed having a way to attach a resource to one owner would be useful :) Anyway thans again for your answer.<br><br>Benoît<br><br><br><div class="gmail_quote"><div dir="ltr">On Wed, 18 May 2016 at 14:49, Sverker Eriksson <<a href="mailto:sverker.eriksson@ericsson.com">sverker.eriksson@ericsson.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000">
<br>
<br>
<div>On 05/18/2016 02:13 PM, Benoit Chesneau
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr"><br>
<br>
<div class="gmail_quote">
<div dir="ltr">On Mon, May 2, 2016 at 4:24 PM Sverker Eriksson
<<a href="mailto:sverker.eriksson@ericsson.com" target="_blank">sverker.eriksson@ericsson.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"> A resource will be
deallocated when<br>
<br>
* all terms created with enif_make_resource() have been
garbage collected<br>
<br>
* AND the call to enif_alloc_resource() has been balanced
by a call to enif_release_resource()<br>
<br>
* AND all calls to enif_keep_resource() have been balanced
by an equal number of calls to enif_release_resource()</div>
<div bgcolor="#FFFFFF" text="#000000"><br>
<br>
<br>
<div>On 05/02/2016 11:47 AM, Benoit Chesneau wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">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.
<div><br>
</div>
<div>So I created a nif resource that have the
following properties:</div>
<div><span style="line-height:1.5">- it is ref
counted, each time a call is made to it, the
counter is incremented and decremented when it
return.</span><br>
</div>
</div>
</blockquote>
</div>
<div bgcolor="#FFFFFF" text="#000000"> A resource already
has an internal ref counter, which is decremented by the
GC and by enif_release_resource().<br>
<br>
Adding your own ref counter is probably either redundant
or just plain wrong.<br>
Every call to enif_release_resource() must be balanced by
a prior call<br>
to either enif_alloc_resource() or enif_keep_resource().
You cannot<br>
release a resource that is still referred to by one of
more terms.</div>
<div bgcolor="#FFFFFF" text="#000000"><br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div>- the process that create it will live until the
vm is closed</div>
</div>
</blockquote>
</div>
<div bgcolor="#FFFFFF" text="#000000"> A resource it not
tied to the process that created it,<br>
it is tied to the terms that refer it.</div>
</blockquote>
<div><br>
</div>
<div>Related to that I recently came with the following
question:</div>
How to tie a nif resource to a owner process to make sure it's
cleaned if the process crash?</div>
<div class="gmail_quote"><br>
</div>
<div class="gmail_quote">Looking at the source of ETS it seems
to use unexposed functions from</div>
<div class="gmail_quote"><a href="https://github.com/erlang/otp/blob/maint/erts/emulator/beam/erl_process.h" rel="noreferrer" style="color:rgb(42,128,185);text-decoration:none;font-family:slack-lato,applelogo,sans-serif;font-size:15px" target="_blank">https://github.com/erlang/otp/blob/maint/erts/emulator/beam/erl_process.h</a><br>
</div>
<div class="gmail_quote"><br>
</div>
<div class="gmail_quote">I think I miss a C function like
"nif_tie_resource(pid, somecalleback)" . Or is there any code
that already does that?</div>
<div class="gmail_quote"><br>
</div>
<div class="gmail_quote">- benoît</div>
</div>
</blockquote>
<br>
<br></div><div bgcolor="#FFFFFF" text="#000000">
If the crashing process contains the last reference to your resource<br>
then it will be destructed as part of the process termination
cleanup<br>
and you don't have to do anything.<br>
<br>
If you want your resource to be "cleaned" at process crash<br>
even though it is still referred by other processes or ETS tables,<br>
then there is no such callback today.<br>
<br>
You can accomplish that however by creating a second "owner"
resource<br>
with a pointer to the "payload" resource. Keep the owner resource
term<br>
in your owning process and let it clean the payload resource in its
destructor.<br>
The destructor of the payload resource (if any) and all code doing<br>
enif_get_resource must recognize and handle an already cleaned
resource.<br>
<br>
<br>
/Sverker, Erlang/OTP<br>
<br>
</div>
</blockquote></div>