[erlang-questions] Could NIFs keep pointers to Erlang terms without copying them?

Dmytro Lytovchenko dmytro.lytovchenko@REDACTED
Wed Feb 8 08:23:54 CET 2017

Modifying the way how garbage collect algorithm calculates the root set
will do what you want. Now the trick is that GC runs per process and nifs
are organized independently. There must be a way for a process to know
which nif holds something from its heap.

On Feb 8, 2017 05:22, "Jean Rougé" <rouge.j@REDACTED> wrote:


If NIFs want to keep an erlang term around, they currently have to copy
them to their own, process-independent environment, using enif_make_copy.

That can be a pretty big performance issue if dabbling with big terms:
imagine for example a NIF storing a complicated data structure, e.g. a
gb_tree; now say we want to keep adding/deleting items from that gb_tree in
our erlang code: we now have to copy the entire thing back and forth.

How hard/conceivable would it be to give NIFs a way to keep a pointer to an
erlang term that they could pass back and forth with the process'
environments without having to copy everything?

I imagine that would mean that it would be the NIF's programmer
responsibility to:

   - ensure that they never keep a pointer to an erlang term that's no
   longer referenced in erlang land (and hence is going to get garbage
   - ensure thread-safety

But the erlang VM would still have to somehow let the NIF know when an
erlang term it has a pointer to has been moved somewhere else.

Is that something that could maybe, in theory, be possible to add to the
current VM?

Thanks a lot,


erlang-questions mailing list
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20170208/e31986ac/attachment.htm>

More information about the erlang-questions mailing list