[erlang-questions] enif_free_env crashes VM

Jachym Holecek freza@REDACTED
Mon Nov 11 17:43:10 CET 2013


Hi,

# Volodymyr Kyrychenko 2013-11-11:
> I have big data structure and need to have massively parallel access to 
> it. SO i invented the wheel called references. Here is how it supposed 
> to work - it is NIF copying this BDS into process independent 
> environment and giving processes reference to the term in that env. 

This is not allowed. Excerpt from erl_nif(3):

  A process bound environment is passed as the first argument to all NIFs.
  All function arguments passed to a NIF will belong to that environment.
  The return value from a NIF must also be a term belonging to the same
  environment.

I'm looking at R14B04 version of the manpage.

> == xl_ref.c =========================================================
> 
> #include <erl_nif.h>
> #include <stdio.h>
> 
> [...]
>
> ERL_NIF_TERM xl_ref_value(ErlNifEnv* env, int argc, const ERL_NIF_TERM 
> argv[]) {
>     ref_t* ref;
>     if (enif_get_resource(env, argv[0], XL_REF_RESOURCE, (void**)&ref))
>         return ref->value;

This is where the violation happens.

>     else
>         return enif_make_badarg(env);
> }

BR,
	-- Jachym



More information about the erlang-questions mailing list