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_;