From 84e19b58d8e2110dc0d074727af2e3da23daff60 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Sat, 4 Jun 2016 22:57:34 +0800 Subject: [PATCH] Event: avoid multi global conflict Signed-off-by: Haomai Wang --- src/msg/async/Event.cc | 7 +++++-- src/msg/async/Event.h | 17 +++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index b8d806ef356ba..752fcb5371d49 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -59,7 +59,6 @@ ostream& EventCenter::_event_prefix(std::ostream *_dout) << " time_id=" << time_event_next_id << ")."; } -EventCenter *EventCenter::centers[MAX_EVENTCENTER]; thread_local EventCenter* local_center = nullptr; int EventCenter::init(int n, unsigned i) @@ -143,7 +142,11 @@ EventCenter::~EventCenter() void EventCenter::set_owner() { - centers[idx] = local_center = this; + cct->lookup_or_create_singleton_object( + global_centers, "AsyncMessenger::EventCenter::global_center"); + assert(global_centers && !global_centers->centers[idx]); + global_centers->centers[idx] = local_center = this; + ldout(cct, 1) << __func__ << " idx=" << idx << " local_center=" << local_center << dendl; } int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt) diff --git a/src/msg/async/Event.h b/src/msg/async/Event.h index f692c71bbdbf0..184a7ca06e036 100644 --- a/src/msg/async/Event.h +++ b/src/msg/async/Event.h @@ -90,10 +90,17 @@ inline EventCenter* center() { * EventCenter maintain a set of file descriptor and handle registered events. */ class EventCenter { + using clock_type = ceph::coarse_mono_clock; // should be enough; static const int MAX_EVENTCENTER = 24; - static EventCenter *centers[MAX_EVENTCENTER]; + + struct AssociatedCenters { + EventCenter *centers[MAX_EVENTCENTER]; + AssociatedCenters(CephContext *c) { + memset(centers, 0, MAX_EVENTCENTER * sizeof(EventCenter*)); + } + }; struct FileEvent { int mask; @@ -125,6 +132,7 @@ class EventCenter { NetHandler net; EventCallbackRef notify_handler; unsigned idx = 10000; + AssociatedCenters *global_centers; int process_time_events(); FileEvent *_get_file_event(int fd) { @@ -194,9 +202,10 @@ class EventCenter { public: template - static void submit_to(int i, func &&f, bool nowait = false) { - assert(i < MAX_EVENTCENTER); - EventCenter *c = centers[i]; + void submit_to(int i, func &&f, bool nowait = false) { + assert(i < MAX_EVENTCENTER && global_centers); + EventCenter *c = global_centers->centers[i]; + assert(c); if (c->in_thread()) { f(); return ; -- 2.39.5