aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2019-02-11 14:39:46 +0100
committerSverker Eriksson <[email protected]>2019-02-11 14:39:46 +0100
commit2b8a46f154fb411c47262eb1c439a912d1fc8fd5 (patch)
tree6fe1ac4c6a5d2624a364aea9ba6068cb787c0e0e
parent0a72d1714f7d7f447a78433451c39c75da6ae103 (diff)
parent3f5c2b86b7dcd1d8b5a2eacad92b659ac9709a53 (diff)
downloadotp-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
-rw-r--r--erts/emulator/beam/erl_nif.c7
-rw-r--r--erts/emulator/beam/global.h3
-rw-r--r--erts/emulator/sys/common/erl_check_io.c2
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)) {