]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Event: remove file_lock
authorHaomai Wang <haomai@xsky.com>
Tue, 8 Mar 2016 03:29:51 +0000 (11:29 +0800)
committerHaomai Wang <haomai@xsky.com>
Tue, 12 Jul 2016 15:48:33 +0000 (23:48 +0800)
Now all EventCenter will exists within one thread, it will let all file events
api changes without locks.

Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/Event.cc
src/msg/async/Event.h

index 3dbd5726bfa67944c17d6ef7ff5b6ce18f600b96..f9f61722e11ac9728dfd63badca69a7d5979f1a7 100644 (file)
@@ -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<std::mutex> 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<std::mutex> 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<FiredFileEvent> 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();
index 7375e6d9fa501088be954380f7ddf09c609730c8..65156141e1ec7210be221f8f4b3058e75f26f5a2 100644 (file)
@@ -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<EventCallbackRef> external_events;
   vector<FileEvent> file_events;