From: James Sedgwick <jsedgwick@fb.com> Date: Wed, 23 Sep 2015 21:17:46 +0000 (-0700) Subject: revert D2379210 X-Git-Tag: deprecate-dynamic-initializer~379 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ac75bb2d471a5e6723f811d29c8e9ccd2d6b0f48;p=folly.git revert D2379210 Summary: This broke EventBase tests, which I managed not to run because they're marked as extended for some reason :( I don't have time to take another stab at this at the moment so I'm reverting for now Reviewed By: @djwatson Differential Revision: D2467789 --- diff --git a/folly/io/async/EventBase.cpp b/folly/io/async/EventBase.cpp index 5adb8c15..b3a12a4a 100644 --- a/folly/io/async/EventBase.cpp +++ b/folly/io/async/EventBase.cpp @@ -123,13 +123,7 @@ void EventBase::CobTimeout::timeoutExpired() noexcept { } // The CobTimeout object was allocated on the heap by runAfterDelay(), - // so delete it now that it has fired. - delete this; -} - -void EventBase::CobTimeout::callbackCanceled() noexcept { - // The CobTimeout object was allocated on the heap by runAfterDelay(), - // so delete it now that it has been canceled. + // so delete it now that the it has fired. delete this; } @@ -181,7 +175,6 @@ EventBase::EventBase(bool enableTimeMeasurement) } VLOG(5) << "EventBase(): Created."; initNotificationQueue(); - wheelTimer_ = HHWheelTimer::UniquePtr(new HHWheelTimer(this)); RequestContext::saveContext(); } @@ -208,7 +201,6 @@ EventBase::EventBase(event_base* evb, bool enableTimeMeasurement) throw std::invalid_argument("EventBase(): event base cannot be nullptr"); } initNotificationQueue(); - wheelTimer_ = HHWheelTimer::UniquePtr(new HHWheelTimer(this)); RequestContext::saveContext(); } @@ -224,7 +216,10 @@ EventBase::~EventBase() { // (Note that we don't fire them. The caller is responsible for cleaning up // its own data structures if it destroys the EventBase with unfired events // remaining.) - wheelTimer_->cancelAll(); + while (!pendingCobTimeouts_.empty()) { + CobTimeout* timeout = &pendingCobTimeouts_.front(); + delete timeout; + } while (!runBeforeLoopCallbacks_.empty()) { delete &runBeforeLoopCallbacks_.front(); @@ -659,11 +654,12 @@ void EventBase::runAfterDelay(const Cob& cob, bool EventBase::tryRunAfterDelay(const Cob& cob, int milliseconds, TimeoutManager::InternalEnum in) { - // A previous implementation could fail, and the API is retained for - // backwards compatibility. - wheelTimer_->scheduleTimeout( - new CobTimeout(cob), - std::chrono::milliseconds(milliseconds)); + CobTimeout* timeout = new CobTimeout(this, cob, in); + if (!timeout->scheduleTimeout(milliseconds)) { + delete timeout; + return false; + } + pendingCobTimeouts_.push_back(*timeout); return true; } diff --git a/folly/io/async/EventBase.h b/folly/io/async/EventBase.h index 47697fde..65b6a45f 100644 --- a/folly/io/async/EventBase.h +++ b/folly/io/async/EventBase.h @@ -18,7 +18,6 @@ #include <glog/logging.h> #include <folly/io/async/AsyncTimeout.h> -#include <folly/io/async/HHWheelTimer.h> #include <folly/io/async/TimeoutManager.h> #include <folly/io/async/Request.h> #include <folly/Executor.h> @@ -650,16 +649,26 @@ class EventBase : private boost::noncopyable, // small object used as a callback arg with enough info to execute the // appropriate client-provided Cob - class CobTimeout : public HHWheelTimer::Callback { + class CobTimeout : public AsyncTimeout { public: - explicit CobTimeout(const Cob& c) : cob_(c) {} + CobTimeout(EventBase* b, const Cob& c, TimeoutManager::InternalEnum in) + : AsyncTimeout(b, in), cob_(c) {} - void timeoutExpired() noexcept override; - - void callbackCanceled() noexcept override; + virtual void timeoutExpired() noexcept; private: Cob cob_; + + public: + typedef boost::intrusive::list_member_hook< + boost::intrusive::link_mode<boost::intrusive::auto_unlink> > ListHook; + + ListHook hook; + + typedef boost::intrusive::list< + CobTimeout, + boost::intrusive::member_hook<CobTimeout, ListHook, &CobTimeout::hook>, + boost::intrusive::constant_time_size<false> > List; }; typedef LoopCallback::List LoopCallbackList; @@ -672,7 +681,7 @@ class EventBase : private boost::noncopyable, void initNotificationQueue(); - HHWheelTimer::UniquePtr wheelTimer_; + CobTimeout::List pendingCobTimeouts_; LoopCallbackList loopCallbacks_; LoopCallbackList runBeforeLoopCallbacks_;