X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fio%2Fasync%2FEventBase.cpp;h=352e41f5afb187252059cfaced411d8c81003d63;hb=b0b6a792e3f764921bd43fb43737ea7eca257e68;hp=11c3a601f7f7782e136a2b49486125e43114582f;hpb=6e9044430269068cc997e4077a366b5a1628c3af;p=folly.git diff --git a/folly/io/async/EventBase.cpp b/folly/io/async/EventBase.cpp index 11c3a601..352e41f5 100644 --- a/folly/io/async/EventBase.cpp +++ b/folly/io/async/EventBase.cpp @@ -22,15 +22,16 @@ #include +#include #include #include #include #include -#include #include #include #include +#include namespace folly { @@ -566,7 +567,7 @@ bool EventBase::runInEventBaseThread(Func fn) { return true; } -bool EventBase::runInEventBaseThreadAndWait(FuncRef fn) { +bool EventBase::runInEventBaseThreadAndWait(Func fn) { if (inRunningEventBaseThread()) { LOG(ERROR) << "EventBase " << this << ": Waiting in the event loop is not " << "allowed"; @@ -574,18 +575,20 @@ bool EventBase::runInEventBaseThreadAndWait(FuncRef fn) { } Baton<> ready; - runInEventBaseThread([&] { + runInEventBaseThread([&ready, fn = std::move(fn)]() mutable { SCOPE_EXIT { ready.post(); }; - fn(); + // A trick to force the stored functor to be executed and then destructed + // before posting the baton and waking the waiting thread. + copy(std::move(fn))(); }); ready.wait(); return true; } -bool EventBase::runImmediatelyOrRunInEventBaseThreadAndWait(FuncRef fn) { +bool EventBase::runImmediatelyOrRunInEventBaseThreadAndWait(Func fn) { if (isInEventBaseThread()) { fn(); return true; @@ -624,12 +627,12 @@ bool EventBase::runLoopCallbacks() { void EventBase::initNotificationQueue() { // Infinite size queue - queue_.reset(new NotificationQueue()); + queue_ = std::make_unique>(); // We allocate fnRunner_ separately, rather than declaring it directly // as a member of EventBase solely so that we don't need to include // NotificationQueue.h from EventBase.h - fnRunner_.reset(new FunctionRunner()); + fnRunner_ = std::make_unique(); // Mark this as an internal event, so event_base_loop() will return if // there are no other events besides this one installed. @@ -756,4 +759,4 @@ VirtualEventBase& EventBase::getVirtualEventBase() { return *virtualEventBase_; } -} // folly +} // namespace folly