From ac75bb2d471a5e6723f811d29c8e9ccd2d6b0f48 Mon Sep 17 00:00:00 2001 From: James Sedgwick Date: Wed, 23 Sep 2015 14:17:46 -0700 Subject: [PATCH] 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 --- folly/io/async/EventBase.cpp | 26 +++++++++++--------------- folly/io/async/EventBase.h | 23 ++++++++++++++++------- 2 files changed, 27 insertions(+), 22 deletions(-) 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 #include -#include #include #include #include @@ -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 > ListHook; + + ListHook hook; + + typedef boost::intrusive::list< + CobTimeout, + boost::intrusive::member_hook, + boost::intrusive::constant_time_size > 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_; -- 2.34.1