Running NIF code in driver handlers
Tue Sep 15 16:53:18 CEST 2020
I've got ab interesting bug.
I have a driver (it is more convenient than NIF to handle sockets
because the driver has state).
I tried to call enif_make_maps from port_call callback and got into
erts_maps_put is calling erts_hashmap_insert
then it goes into macro ERTS_VERIFY_UNUSED_TEMP_ALLOC(p);
then goes to erts_proc_sched_data
and fails on ASSERT(ERTS_SCHEDULER_IS_DIRTY(esdp));
Problem is following: I call env = enif_alloc_env();
but I'm running on a scheduler thread, because it is driver port_call callback.
I do not have any working process, so c_p->scheduler_data is zero,
thus this code assumes that I'm on a dirty scheduler thread.
So it seems that it is illegal to call enif_alloc_env in a driver callback and
maybe even illegal to do it in a NIF callback because we already have env?
Should I create a better test example? Is it a designed behaviour or
can be fixed?
More information about the erlang-questions