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)));
}
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)
{
void EventCenter::set_owner()
{
- thread_id = owner = pthread_self();
+ local_center = this;
}
int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt)
int EventCenter::process_events(int timeout_microseconds)
{
- // Must set owner before looping
- assert(owner);
struct timeval tv;
int numevents;
bool trigger_time = false;
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;
#endif
#endif
-#include <pthread.h>
-
#include "include/atomic.h"
#include "include/Context.h"
#include "include/unordered_map.h"
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.
int notify_receive_fd;
int notify_send_fd;
NetHandler net;
- pthread_t owner;
EventCallbackRef notify_handler;
int process_time_events();
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) {
}
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);
// Used by external thread
void dispatch_event_external(EventCallbackRef e);
+ inline bool in_thread() const {
+ return local_center == this;
+ }
};
#endif