aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2017-02-20 20:20:29 +0100
committerSverker Eriksson <[email protected]>2017-02-20 20:20:29 +0100
commitaf7cf70ca22a34add7836963d086ca0764f4fbae (patch)
tree2c9dbcbb87fbb71142ac2356c1661e79cbb706ec /erts/emulator
parentd8d8301a252579a000b24bab87d26549da0e813a (diff)
downloadotp-af7cf70ca22a34add7836963d086ca0764f4fbae.tar.gz
otp-af7cf70ca22a34add7836963d086ca0764f4fbae.tar.bz2
otp-af7cf70ca22a34add7836963d086ca0764f4fbae.zip
Fix ErlNifMonitor handling
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/beam/erl_nif.c7
-rw-r--r--erts/emulator/beam/global.h1
-rw-r--r--erts/emulator/beam/io.c6
-rw-r--r--erts/emulator/test/nif_SUITE_data/nif_SUITE.c4
4 files changed, 8 insertions, 10 deletions
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c
index daec4ac9e9..e6da4c1a76 100644
--- a/erts/emulator/beam/erl_nif.c
+++ b/erts/emulator/beam/erl_nif.c
@@ -2305,9 +2305,6 @@ void erts_resource_stop(ErtsResource* resource, ErlNifEvent e,
post_nif_noproc(&msg_env);
}
-/* SVERK SVERK: Move to ?.h */
-void erts_ref_to_driver_monitor(Eterm ref, ErlDrvMonitor*);
-
void erts_fire_nif_monitor(ErtsResource* resource, Eterm pid, Eterm ref)
{
ErtsMonitor* rmon;
@@ -3207,8 +3204,8 @@ int enif_demonitor_process(ErlNifEnv* env, void* obj, const ErlNifMonitor* monit
execution_state(env, NULL, &scheduler);
- memcpy(ref_heap, monitor, sizeof(Eterm)*ERTS_REF_THING_SIZE);
- ref = make_internal_ref(ref_heap);
+ ref = erts_driver_monitor_to_ref(ref_heap, monitor);
+
erts_smp_mtx_lock(&rsrc->monitors->lock);
mon = erts_remove_monitor(&rsrc->monitors->root, ref);
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h
index 776f2c599b..c4c848f49f 100644
--- a/erts/emulator/beam/global.h
+++ b/erts/emulator/beam/global.h
@@ -1176,6 +1176,7 @@ void erts_stale_drv_select(Eterm, ErlDrvPort, ErlDrvEvent, int, int);
Port *erts_get_heart_port(void);
void erts_emergency_close_ports(void);
void erts_ref_to_driver_monitor(Eterm ref, ErlDrvMonitor *mon);
+Eterm erts_driver_monitor_to_ref(Eterm* hp, const ErlDrvMonitor *mon);
#if defined(ERTS_SMP) && defined(ERTS_ENABLE_LOCK_COUNT)
void erts_lcnt_enable_io_lock_count(int enable);
diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c
index 9b525cc100..84dc00f641 100644
--- a/erts/emulator/beam/io.c
+++ b/erts/emulator/beam/io.c
@@ -7615,7 +7615,7 @@ void erts_ref_to_driver_monitor(Eterm ref, ErlDrvMonitor *mon)
ERTS_REF_THING_SIZE*sizeof(Uint));
}
-static Eterm driver_monitor_to_ref(Eterm *hp, const ErlDrvMonitor *mon)
+Eterm erts_driver_monitor_to_ref(Eterm *hp, const ErlDrvMonitor *mon)
{
Eterm ref;
ERTS_CT_ASSERT(ERTS_REF_THING_SIZE*sizeof(Uint) <= sizeof(ErlDrvMonitor));
@@ -7685,7 +7685,7 @@ static int do_driver_demonitor_process(Port *prt, const ErlDrvMonitor *monitor)
ErtsMonitor *mon;
Eterm to;
- ref = driver_monitor_to_ref(heap, monitor);
+ ref = erts_driver_monitor_to_ref(heap, monitor);
mon = erts_lookup_monitor(ERTS_P_MONITORS(prt), ref);
if (mon == NULL) {
@@ -7742,7 +7742,7 @@ static ErlDrvTermData do_driver_get_monitored_process(Port *prt,const ErlDrvMoni
Eterm to;
Eterm heap[ERTS_REF_THING_SIZE];
- ref = driver_monitor_to_ref(heap, monitor);
+ ref = erts_driver_monitor_to_ref(heap, monitor);
mon = erts_lookup_monitor(ERTS_P_MONITORS(prt), ref);
if (mon == NULL) {
diff --git a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
index 69c5f09bd5..8fe5ee809a 100644
--- a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
+++ b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
@@ -2708,7 +2708,7 @@ static ERL_NIF_TERM monitor_frenzy_nif(ErlNifEnv* env, int argc, const ERL_NIF_T
else {
unsigned int resource_op = rand_bits(&rnd, 3);
r = resv[rix].obj;
- if (resource_op == 0) {
+ if (resource_op == 0) { /* delete resource */
resv[rix].obj = NULL;
resv[rix].release_cnt++;
enif_mutex_unlock(resv[rix].lock);
@@ -2717,7 +2717,7 @@ static ERL_NIF_TERM monitor_frenzy_nif(ErlNifEnv* env, int argc, const ERL_NIF_T
retval = atom_ok;
break;
}
- else if (resource_op == 1) {
+ else if (resource_op == 1) { /* return resource */
retval = enif_make_resource(env, r);
enif_mutex_unlock(resv[rix].lock);
break;