From 1ddeede83200566666fce80867eb7cb5a61a4f62 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Wed, 20 Apr 2016 14:23:20 -0400 Subject: [PATCH] Event: fix delete_time_event while in processing list Signed-off-by: Haomai Wang --- src/msg/async/Event.cc | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 469ba4b0d90..41157e4c3ad 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -279,7 +279,7 @@ int EventCenter::process_time_events() clock_type::time_point now = clock_type::now(); ldout(cct, 10) << __func__ << " cur time is " << now << dendl; - time_lock.Lock(); + Mutex::Locker l(time_lock); /* If the system clock is moved to the future, and then set back to the * right value, time events may be delayed in a random way. Often this * means that scheduled operations will not be performed soon enough. @@ -291,26 +291,26 @@ int EventCenter::process_time_events() bool clock_skewed = now < last_time; last_time = now; - map >::iterator prev; - list need_process; - for (auto it = time_events.begin(); it != time_events.end(); ) { - prev = it; + while (!time_events.empty()) { + auto it = time_events.begin(); if (now >= it->first || clock_skewed) { - need_process.splice(need_process.end(), it->second); - ++it; - time_events.erase(prev); + if (it->second.empty()) { + time_events.erase(it); + } else { + TimeEvent &e = it->second.front(); + EventCallbackRef cb = e.time_cb; + uint64_t id = e.id; + it->second.pop_front(); + ldout(cct, 10) << __func__ << " process time event: id=" << id << dendl; + processed++; + time_lock.Unlock(); + cb->do_request(id); + time_lock.Lock(); + } } else { break; } } - time_lock.Unlock(); - - for (list::iterator it = need_process.begin(); - it != need_process.end(); ++it) { - ldout(cct, 10) << __func__ << " process time event: id=" << it->id << dendl; - it->time_cb->do_request(it->id); - processed++; - } return processed; } -- 2.47.3