[erlang-questions] mmap file to binary

Sverker Eriksson sverker@REDACTED
Wed Jul 14 11:47:34 CEST 2010


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