]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
Event: avoid multi global conflict
authorHaomai Wang <haomai@xsky.com>
Sat, 4 Jun 2016 14:57:34 +0000 (22:57 +0800)
committerHaomai Wang <haomai@xsky.com>
Wed, 29 Jun 2016 04:14:29 +0000 (12:14 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/Event.cc
src/msg/async/Event.h

index b8d806ef356ba0ff708e6442d852cc29b2e338d3..752fcb5371d497afe7f837a18439a0f86bb8f419 100644 (file)
@@ -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<EventCenter::AssociatedCenters>(
+      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)
index f692c71bbdbf032ccfac570f26f70081aa34aa51..184a7ca06e0364415d07bde3ead7adfd12b6f0cc 100644 (file)
@@ -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 <typename func>
-  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 ;