Move event_base_new out of critical region
authorHaijun Zhu <haijunz@fb.com>
Sun, 27 Mar 2016 07:12:23 +0000 (00:12 -0700)
committerFacebook Github Bot 5 <facebook-github-bot-5-bot@fb.com>
Sun, 27 Mar 2016 07:20:21 +0000 (00:20 -0700)
Summary:event_base_new does not change the global current_base so no need to
call it with the mutex held.

Reviewed By: chadparry

Differential Revision: D3055963

fb-gh-sync-id: df420b189ef0d7d56eda5ad6c32e03b195804e6b
fbshipit-source-id: df420b189ef0d7d56eda5ad6c32e03b195804e6b

folly/io/async/EventBase.cpp

index e51fb08ffa1237628503af7792dc3407b0e06e0d..5dcc99673d070fa188fc39cbdfcded097083b21c 100644 (file)
@@ -145,6 +145,7 @@ EventBase::EventBase(bool enableTimeMeasurement)
   , observer_(nullptr)
   , observerSampleCount_(0)
   , executionObserver_(nullptr) {
+  struct event ev;
   {
     std::lock_guard<std::mutex> lock(libevent_mutex_);
 
@@ -153,10 +154,16 @@ EventBase::EventBase(bool enableTimeMeasurement)
     // allowing examination of its value without an explicit reference here.
     // If ev.ev_base is NULL, then event_init() must be called, otherwise
     // call event_base_new().
-    struct event ev;
     event_set(&ev, 0, 0, nullptr, nullptr);
-    evb_ = (ev.ev_base) ? event_base_new() : event_init();
+    if (!ev.ev_base) {
+      evb_ = event_init();
+    }
+  }
+
+  if (ev.ev_base) {
+    evb_ = event_base_new();
   }
+
   if (UNLIKELY(evb_ == nullptr)) {
     LOG(ERROR) << "EventBase(): Failed to init event base.";
     folly::throwSystemError("error in EventBase::EventBase()");