From 7ca8839f97c059d91a476658e3ffbedb2a7b5424 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Tue, 24 May 2016 15:34:29 +0800 Subject: [PATCH] Event: use local_center instead of pthread id Signed-off-by: Haomai Wang --- src/msg/async/AsyncMessenger.cc | 2 -- src/msg/async/Event.cc | 10 ++++------ src/msg/async/Event.h | 14 +++++++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index 50d48c3ecb0..8c4ff3a7f86 100644 --- a/src/msg/async/AsyncMessenger.cc +++ b/src/msg/async/AsyncMessenger.cc @@ -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::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))); } diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 8d973a2fcf0..e17db8aebb4 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -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; diff --git a/src/msg/async/Event.h b/src/msg/async/Event.h index 7a72179dfa1..b5fe2171f6e 100644 --- a/src/msg/async/Event.h +++ b/src/msg/async/Event.h @@ -37,8 +37,6 @@ #endif #endif -#include - #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 -- 2.39.5