aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Högberg <[email protected]>2018-11-27 07:06:56 +0100
committerJohn Högberg <[email protected]>2018-11-27 07:06:56 +0100
commit423f078e3b8603cbd8bfea3be8709092a861a36e (patch)
tree0b89f8f09bc532cadee64eaf49f5513a4ca66038
parent056b5ef1babe19d0584e3b8daa797a6f10b99854 (diff)
parent39d52f32656ab9ae1f508a0442175b6f0cd58f4c (diff)
downloadotp-423f078e3b8603cbd8bfea3be8709092a861a36e.tar.gz
otp-423f078e3b8603cbd8bfea3be8709092a861a36e.tar.bz2
otp-423f078e3b8603cbd8bfea3be8709092a861a36e.zip
Merge branch 'maint'
* maint: erts: fix attempt to start timer when executing on dirty scheduler
-rw-r--r--erts/emulator/beam/erl_node_tables.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_node_tables.c b/erts/emulator/beam/erl_node_tables.c
index f4dc60941a..18ed782ae3 100644
--- a/erts/emulator/beam/erl_node_tables.c
+++ b/erts/emulator/beam/erl_node_tables.c
@@ -421,8 +421,25 @@ static void schedule_delete_dist_entry(DistEntry* dep)
*
* Note that timeouts do not guarantee thread progress.
*/
- erts_schedule_thr_prgr_later_op(start_timer_delete_dist_entry,
- dep, &dep->later_op);
+ ErtsSchedulerData *esdp = erts_get_scheduler_data();
+ if (esdp && !ERTS_SCHEDULER_IS_DIRTY(esdp)) {
+ erts_schedule_thr_prgr_later_op(start_timer_delete_dist_entry,
+ dep, &dep->later_op);
+ } else {
+ /*
+ * Since OTP 20, it's possible that destructor is executed on
+ * a dirty scheduler. Aux work cannot be done on a dirty
+ * scheduler, and scheduling any aux work on a dirty scheduler
+ * makes the scheduler to loop infinitely.
+ * To avoid this, make a spot jump: schedule this function again
+ * on a first normal scheduler. It is guaranteed to be always
+ * online. Since it's a rare event, this shall not pose a big
+ * utilisation hit.
+ */
+ erts_schedule_misc_aux_work(1,
+ (void (*)(void *))schedule_delete_dist_entry,
+ (void *) dep);
+ }
}
static void