From 31cbae2079c8ebe7b957fb99b382fcc437923147 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Tue, 28 Jun 2016 12:11:13 +0800 Subject: [PATCH] msg/async/Event: change to use pthread_t to indicate whether the same thread thread_local has problem in TmapMigratePP.DataScan case that it will be assigned to zero unexpectedly. pthread_t is much cheaper than gettid since it's a library implementation. Signed-off-by: Haomai Wang --- src/msg/async/Event.cc | 7 +++---- src/msg/async/Event.h | 9 ++------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 4a3105d93a9a3..275c4d1905dd1 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -59,8 +59,6 @@ ostream& EventCenter::_event_prefix(std::ostream *_dout) << " time_id=" << time_event_next_id << ")."; } -thread_local EventCenter* local_center = nullptr; - int EventCenter::init(int n, unsigned i) { // can't init multi times @@ -145,8 +143,9 @@ void EventCenter::set_owner() 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; + global_centers->centers[idx] = this; + owner = pthread_self(); + ldout(cct, 1) << __func__ << " idx=" << idx << " owner=" << owner << 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 27bbca5b7155b..7375e6d9fa501 100644 --- a/src/msg/async/Event.h +++ b/src/msg/async/Event.h @@ -80,12 +80,6 @@ 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. */ @@ -119,6 +113,7 @@ class EventCenter { CephContext *cct; int nevent; // Used only to external event + pthread_t owner; std::mutex external_lock, file_lock;; std::atomic_ulong external_num_events; deque external_events; @@ -169,7 +164,7 @@ class EventCenter { // Used by external thread void dispatch_event_external(EventCallbackRef e); inline bool in_thread() const { - return local_center == this; + return pthread_equal(pthread_self(), owner); } private: