File 0684-erts-Fix-bug-in-timer-wheel-at-cancel-during-bump-yi.patch of Package erlang

From 4d3a7b85af410122932401eeac8c1084fdfdb5ae Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Mon, 29 Apr 2019 20:24:04 +0200
Subject: [PATCH 2/2] 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.
---
 erts/emulator/beam/time.c | 6 ++++--
 1 file 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) {
-- 
2.16.4

openSUSE Build Service is sponsored by