diff options
author | Sverker Eriksson <[email protected]> | 2019-04-29 20:24:04 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2019-04-29 20:24:04 +0200 |
commit | 4d3a7b85af410122932401eeac8c1084fdfdb5ae (patch) | |
tree | 645babd6d694ffe39f8d82b67ee8168196542e49 /erts/emulator/beam | |
parent | f31bf49d94ee21682f90aa86fa6e4ec4753078d8 (diff) | |
download | otp-4d3a7b85af410122932401eeac8c1084fdfdb5ae.tar.gz otp-4d3a7b85af410122932401eeac8c1084fdfdb5ae.tar.bz2 otp-4d3a7b85af410122932401eeac8c1084fdfdb5ae.zip |
erts: Fix bug in timer wheel at cancel during bump yield
Symptom:
Failed debug assert in find_next_timeout
ERTS_TW_ASSERT(tiw->yield_slot == ERTS_TW_SLOT_INACTIVE);
Problem:
If remove_timer() was called in between yielding erts_bump_timers()
tiw->true_next_timeout_time could be set to 0 leading to
find_next_timeout() being called before all bumping is done.
Solution:
Don't clear tiw->true_next_timeout_time in remove_timer()
if tiw->yield_slot is active.
Does not seem this bug could cause other more harmful symptoms,
but not sure.
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/time.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/erts/emulator/beam/time.c b/erts/emulator/beam/time.c index 0936832115..9eb020d070 100644 --- a/erts/emulator/beam/time.c +++ b/erts/emulator/beam/time.c @@ -701,7 +701,8 @@ remove_timer(ErtsTimerWheel *tiw, ErtsTWheelTimer *p) if (slot < ERTS_TW_SOON_WHEEL_END_SLOT) { if (empty_slot && tiw->true_next_timeout_time - && p->timeout_pos == tiw->next_timeout_pos) { + && p->timeout_pos == tiw->next_timeout_pos + && tiw->yield_slot == ERTS_TW_SLOT_INACTIVE) { tiw->true_next_timeout_time = 0; } if (--tiw->soon.nto == 0) @@ -714,7 +715,8 @@ remove_timer(ErtsTimerWheel *tiw, ErtsTWheelTimer *p) ErtsMonotonicTime tpos = tiw->later.min_tpos; tpos &= ERTS_TW_LATER_WHEEL_POS_MASK; tpos -= ERTS_TW_LATER_WHEEL_SLOT_SIZE; - if (tpos == tiw->next_timeout_pos) + if (tpos == tiw->next_timeout_pos + && tiw->yield_slot == ERTS_TW_SLOT_INACTIVE) tiw->true_next_timeout_time = 0; } if (--tiw->later.nto == 0) { |