]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Event: Let external events ran without lock/unlock 3913/head
authorHaomai Wang <haomaiwang@gmail.com>
Mon, 9 Mar 2015 16:26:22 +0000 (00:26 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Mon, 9 Mar 2015 16:26:22 +0000 (00:26 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/msg/async/Event.cc

index bbb2457fb76fd07db44374713f8a6b7cc5bfb153..f6680417e567feecd9b3b72624f32341a52c57b3 100644 (file)
@@ -364,17 +364,19 @@ int EventCenter::process_events(int timeout_microseconds)
   if (trigger_time)
     numevents += process_time_events();
 
-  {
-    external_lock.Lock();
-    while (!external_events.empty()) {
-      EventCallbackRef e = external_events.front();
-      external_events.pop_front();
-      external_lock.Unlock();
+  external_lock.Lock();
+  if (external_events.empty()) {
+    external_lock.Unlock();
+  } else {
+    deque<EventCallbackRef> cur_process;
+    cur_process.swap(external_events);
+    external_lock.Unlock();
+    while (!cur_process.empty()) {
+      EventCallbackRef e = cur_process.front();
+      cur_process.pop_front();
       if (e)
         e->do_request(0);
-      external_lock.Lock();
     }
-    external_lock.Unlock();
   }
   return numevents;
 }