<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><div bgcolor="#FFFFFF" text="#000000"></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">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>