[erlang-questions] mmap file to binary

Kenji Rikitake kenji.rikitake@REDACTED
Thu Aug 5 08:46:47 CEST 2010


Is there any semantic difference between the enif_alloc()/enif_free()
pair and the enif_alloc_resource/enig_release_resource() pair?

I've only used the enif_alloc()/enif_free() pair so far, within a
function and the allocated objects are not referred from outside the
function.

Regards,
Kenji Rikitake

In the message <4C3D87B6.5070407@REDACTED>
dated Wed, Jul 14, 2010 at 11:47:10AM +0200,
Sverker Eriksson <sverker@REDACTED> writes:
> Max Lapshin wrote:
> >I have to do so:
> >
> >
> >    Mmap *mm;
> >    mm = (Mmap *)enif_alloc_resource(mmap_resource, sizeof(Mmap));
> >
> >    mm->ptr = m;
> >    mm->size = (size_t)file_stat.st_size;
> >
> >
> >    m_bin = enif_make_resource_binary(env, mm, mm->ptr, mm->size);
> >    enif_release_resource(mm);   % <---------
> >    return enif_make_tuple2(env, enif_make_atom(env, "ok"), m_bin);
> >
> >
> >If I don't add enif_release_resource, it will never be garbage
> >collected. Why I have to do so
> That was a design choice. Ownership of resources are never transfered.
> 
> enif_allloc_resource gives you ("the NIF") ownership of the resource.
> enif_make_resource and enif_make_resource_binary adds a new ownership 
> from the created Erlang term.
> 
> So, to really free a resource, both "the NIF" ownership has to be 
> released by calling enif_release_resource and all referring terms has to 
> be garbage collected.
> 
> 
> /Sverker, Erlang/OTP


More information about the erlang-questions mailing list