Hi All,
I’m trying to clone a NIF resource like this:
/* some code */
struct array_t *arr = (struct array_t *) enif_alloc_resource(ARRAY_RESOURCE, sizeof(struct array_t));
/* init the arr structure here */
ERL_NIF_TERM res1 = enif_make_resource(env, arr);
enif_release_resource(arr);
ERL_NIF_TERM res2 = enif_make_resource(env, arr);
enif_release_resource(arr);
return (enif_make_tuple(env, res1, res2));
But res1 and res2 are equal.
What i’d like to achieve here it to get two different resources (res1 =/= res2) pointing to the same array_t in memory.
Is that possible? If yes … how?
N.B: this is an experiement, please don’t tell me why
1 Like
No, you cannot do that. The documentation says
“Two resource terms will compare equal if and only if they would yield the same resource object pointer when passed to enif_get_resource
”.
To get two different resources (res1=/=res2) you need to do two enif_alloc_resource
calls.
2 Likes
You can of course solve it by introducing an indirection of your own. Two enif_alloc_resource
blocks each with a pointer to the same array_t allocated with enif_alloc
for example. And then do your own memory management of that array_t block with reference counting or whatever.
1 Like
One more thing.
Your code example is buggy. The second call to enif_release_resource
is wrong.
“Each call to enif_release_resource
must correspond to a previous call to enif_alloc_resource
or enif_keep_resource
. References made by enif_make_resource
can only be removed by the garbage collector.”
If you run that code, you may get a premature deallocation of the resource while one of res1
or res2
is still referring it.
3 Likes
@sverker Thanks for the clarification
1 Like