diff options
author | Sverker Eriksson <[email protected]> | 2019-02-11 14:39:46 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2019-02-11 14:39:46 +0100 |
commit | 2b8a46f154fb411c47262eb1c439a912d1fc8fd5 (patch) | |
tree | 6fe1ac4c6a5d2624a364aea9ba6068cb787c0e0e /erts | |
parent | 0a72d1714f7d7f447a78433451c39c75da6ae103 (diff) | |
parent | 3f5c2b86b7dcd1d8b5a2eacad92b659ac9709a53 (diff) | |
download | otp-2b8a46f154fb411c47262eb1c439a912d1fc8fd5.tar.gz otp-2b8a46f154fb411c47262eb1c439a912d1fc8fd5.tar.bz2 otp-2b8a46f154fb411c47262eb1c439a912d1fc8fd5.zip |
Merge branch 'sverker/enif_select-faulty-assert' into maint
* sverker/enif_select-faulty-assert:
erts: Fix faulty debug assert in enif_select
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/beam/erl_nif.c | 7 | ||||
-rw-r--r-- | erts/emulator/beam/global.h | 3 | ||||
-rw-r--r-- | erts/emulator/sys/common/erl_check_io.c | 2 |
3 files changed, 11 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c index ee6e6085b6..17041cc91c 100644 --- a/erts/emulator/beam/erl_nif.c +++ b/erts/emulator/beam/erl_nif.c @@ -2354,6 +2354,13 @@ static void dtor_demonitor(ErtsMonitor* mon, void* context) erts_proc_sig_send_demonitor(mon); } +#ifdef DEBUG +int erts_dbg_is_resource_dying(ErtsResource* resource) +{ + return resource->monitors && rmon_is_dying(resource->monitors); +} +#endif + # define NIF_RESOURCE_DTOR &nif_resource_dtor static int nif_resource_dtor(Binary* bin) diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index 36b753ca9c..f564472081 100644 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -113,6 +113,9 @@ extern Eterm erts_bld_resource_ref(Eterm** hp, ErlOffHeap*, ErtsResource*); extern void erts_pre_nif(struct enif_environment_t*, Process*, struct erl_module_nif*, Process* tracee); extern void erts_post_nif(struct enif_environment_t* env); +#ifdef DEBUG +int erts_dbg_is_resource_dying(ErtsResource*); +#endif extern void erts_resource_stop(ErtsResource*, ErlNifEvent, int is_direct_call); void erts_fire_nif_monitor(ErtsMonitor *tmon); void erts_nif_demonitored(ErtsResource* resource); diff --git a/erts/emulator/sys/common/erl_check_io.c b/erts/emulator/sys/common/erl_check_io.c index ac9a070bce..c39cd01e1c 100644 --- a/erts/emulator/sys/common/erl_check_io.c +++ b/erts/emulator/sys/common/erl_check_io.c @@ -962,7 +962,7 @@ enif_select(ErlNifEnv* env, ErtsDrvSelectDataState *free_select = NULL; ErtsNifSelectDataState *free_nif = NULL; - ASSERT(!resource->monitors); + ASSERT(!erts_dbg_is_resource_dying(resource)); #ifdef ERTS_SYS_CONTINOUS_FD_NUMBERS if (!grow_drv_ev_state(fd)) { |