]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
Event: use local_center instead of pthread id
authorHaomai Wang <haomai@xsky.com>
Tue, 24 May 2016 07:34:29 +0000 (15:34 +0800)
committerHaomai Wang <haomai@xsky.com>
Wed, 29 Jun 2016 04:14:04 +0000 (12:14 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/AsyncMessenger.cc
src/msg/async/Event.cc
src/msg/async/Event.h

index 50d48c3ecb0d63f415857317d67bdd6ebcd6f98a..8c4ff3a7f862cce6c7436265b581db7e347f09ee 100644 (file)
@@ -513,9 +513,7 @@ void WorkerPool::release_worker(EventCenter* c)
 void WorkerPool::barrier()
 {
   ldout(cct, 10) << __func__ << " started." << dendl;
-  pthread_t cur = pthread_self();
   for (vector<Worker*>::iterator it = workers.begin(); it != workers.end(); ++it) {
-    assert(cur != (*it)->center.get_owner());
     barrier_count.inc();
     (*it)->center.dispatch_event_external(EventCallbackRef(new C_barrier(this)));
   }
index 8d973a2fcf0c5f18767b084ab4e7cee8f395c6d3..e17db8aebb4de15a46ba0797d9ae426a7ed2663e 100644 (file)
@@ -57,11 +57,11 @@ class C_handle_notify : public EventCallback {
 
 ostream& EventCenter::_event_prefix(std::ostream *_dout)
 {
-  return *_dout << "Event(" << this << " owner=" << get_owner() << " nevent=" << nevent
+  return *_dout << "Event(" << this << " nevent=" << nevent
                 << " time_id=" << time_event_next_id << ").";
 }
 
-static thread_local pthread_t thread_id = 0;
+thread_local EventCenter* local_center = nullptr;
 
 int EventCenter::init(int n)
 {
@@ -141,7 +141,7 @@ EventCenter::~EventCenter()
 
 void EventCenter::set_owner()
 {
-  thread_id = owner = pthread_self();
+  local_center = this;
 }
 
 int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt)
@@ -297,8 +297,6 @@ int EventCenter::process_time_events()
 
 int EventCenter::process_events(int timeout_microseconds)
 {
-  // Must set owner before looping
-  assert(owner);
   struct timeval tv;
   int numevents;
   bool trigger_time = false;
@@ -398,7 +396,7 @@ void EventCenter::dispatch_event_external(EventCallbackRef e)
   external_events.push_back(e);
   uint64_t num = external_num_events.inc();
   external_lock.Unlock();
-  if (thread_id != owner)
+  if (!in_thread())
     wakeup();
 
   ldout(cct, 10) << __func__ << " " << e << " pending " << num << dendl;
index 7a72179dfa1d6023e3069f18458be72057f35853..b5fe2171f6e72897da0c389e848df748c112036e 100644 (file)
@@ -37,8 +37,6 @@
 #endif
 #endif
 
-#include <pthread.h>
-
 #include "include/atomic.h"
 #include "include/Context.h"
 #include "include/unordered_map.h"
@@ -81,6 +79,11 @@ class EventDriver {
   virtual int resize_events(int newsize) = 0;
 };
 
+extern thread_local EventCenter* local_center;
+
+inline EventCenter* center() {
+  return local_center;
+}
 
 /*
  * EventCenter maintain a set of file descriptor and handle registered events.
@@ -115,7 +118,6 @@ class EventCenter {
   int notify_receive_fd;
   int notify_send_fd;
   NetHandler net;
-  pthread_t owner;
   EventCallbackRef notify_handler;
 
   int process_time_events();
@@ -134,7 +136,7 @@ class EventCenter {
     time_lock("AsyncMessenger::time_lock"),
     external_num_events(0),
     driver(NULL), time_event_next_id(1),
-    notify_receive_fd(-1), notify_send_fd(-1), net(c), owner(0),
+    notify_receive_fd(-1), notify_send_fd(-1), net(c),
     notify_handler(NULL),
     already_wakeup(0) {
   }
@@ -143,7 +145,6 @@ class EventCenter {
 
   int init(int nevent);
   void set_owner();
-  pthread_t get_owner() { return owner; }
 
   // Used by internal thread
   int create_file_event(int fd, int mask, EventCallbackRef ctxt);
@@ -155,6 +156,9 @@ class EventCenter {
 
   // Used by external thread
   void dispatch_event_external(EventCallbackRef e);
+  inline bool in_thread() const {
+    return local_center == this;
+  }
 };
 
 #endif