From 24b3c27db1d2cd0b2f70ca2f4e341cfc088cf248 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Tue, 8 Mar 2016 11:29:51 +0800 Subject: [PATCH] Event: remove file_lock Now all EventCenter will exists within one thread, it will let all file events api changes without locks. Signed-off-by: Haomai Wang --- src/msg/async/Event.cc | 10 ---------- src/msg/async/Event.h | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 3dbd5726bfa67..f9f61722e11ac 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -150,7 +150,6 @@ void EventCenter::set_owner() int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt) { int r = 0; - std::lock_guard l(file_lock); if (fd >= nevent) { int new_size = nevent << 2; while (fd > new_size) @@ -195,7 +194,6 @@ int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt) void EventCenter::delete_file_event(int fd, int mask) { assert(fd >= 0); - std::lock_guard l(file_lock); if (fd >= nevent) { ldout(cct, 1) << __func__ << " delete event fd=" << fd << " is equal or greater than nevent=" << nevent << "mask=" << mask << dendl; @@ -332,38 +330,30 @@ int EventCenter::process_events(int timeout_microseconds) ldout(cct, 10) << __func__ << " wait second " << tv.tv_sec << " usec " << tv.tv_usec << dendl; vector fired_events; numevents = driver->event_wait(fired_events, &tv); - file_lock.lock(); for (int j = 0; j < numevents; j++) { int rfired = 0; FileEvent *event; EventCallbackRef cb; event = _get_file_event(fired_events[j].fd); - // FIXME: Actually we need to pick up some ways to reduce potential - // file_lock contention here. /* note the event->mask & mask & ... code: maybe an already processed * event removed an element that fired and we still didn't * processed, so we check if the event is still valid. */ if (event->mask & fired_events[j].mask & EVENT_READABLE) { rfired = 1; cb = event->read_cb; - file_lock.unlock(); cb->do_request(fired_events[j].fd); - file_lock.lock(); } if (event->mask & fired_events[j].mask & EVENT_WRITABLE) { if (!rfired || event->read_cb != event->write_cb) { cb = event->write_cb; - file_lock.unlock(); cb->do_request(fired_events[j].fd); - file_lock.lock(); } } ldout(cct, 20) << __func__ << " event_wq process is " << fired_events[j].fd << " mask is " << fired_events[j].mask << dendl; } - file_lock.unlock(); if (trigger_time) numevents += process_time_events(); diff --git a/src/msg/async/Event.h b/src/msg/async/Event.h index 7375e6d9fa501..65156141e1ec7 100644 --- a/src/msg/async/Event.h +++ b/src/msg/async/Event.h @@ -114,7 +114,7 @@ class EventCenter { int nevent; // Used only to external event pthread_t owner; - std::mutex external_lock, file_lock;; + std::mutex external_lock; std::atomic_ulong external_num_events; deque external_events; vector file_events; -- 2.39.5