HHWheelTimer::HHWheelTimer(folly::EventBase* eventBase,
std::chrono::milliseconds intervalMS,
- AsyncTimeout::InternalEnum internal)
+ AsyncTimeout::InternalEnum internal,
+ std::chrono::milliseconds defaultTimeoutMS)
: AsyncTimeout(eventBase, internal)
, interval_(intervalMS)
+ , defaultTimeout_(defaultTimeoutMS)
, nextTick_(1)
, count_(0)
, catchupEveryN_(DEFAULT_CATCHUP_EVERY_N)
count_++;
}
+void HHWheelTimer::scheduleTimeout(Callback* callback) {
+ CHECK(std::chrono::milliseconds(-1) != defaultTimeout_)
+ << "Default timeout was not initialized";
+ scheduleTimeout(callback, defaultTimeout_);
+}
+
bool HHWheelTimer::cascadeTimers(int bucket, int tick) {
CallbackList cbs;
cbs.swap(buckets_[bucket][tick]);
};
/**
- * Create a new HHWheelTimer with the specified interval.
+ * Create a new HHWheelTimer with the specified interval and the
+ * default timeout value set.
+ *
+ * Objects created using this version of constructor can be used
+ * to schedule both variable interval timeouts using
+ * scheduleTimeout(callback, timeout) method, and default
+ * interval timeouts using scheduleTimeout(callback) method.
*/
static int DEFAULT_TICK_INTERVAL;
explicit HHWheelTimer(folly::EventBase* eventBase,
std::chrono::milliseconds intervalMS =
std::chrono::milliseconds(DEFAULT_TICK_INTERVAL),
AsyncTimeout::InternalEnum internal =
- AsyncTimeout::InternalEnum::NORMAL);
+ AsyncTimeout::InternalEnum::NORMAL,
+ std::chrono::milliseconds defaultTimeoutMS =
+ std::chrono::milliseconds(-1));
/**
* Destroy the HHWheelTimer.
return interval_;
}
+ /**
+ * Get the default timeout interval for this HHWheelTimer.
+ *
+ * Returns the timeout interval in milliseconds.
+ */
+ std::chrono::milliseconds getDefaultTimeout() const {
+ return defaultTimeout_;
+ }
+
/**
* Schedule the specified Callback to be invoked after the
* specified timeout interval.
void scheduleTimeoutImpl(Callback* callback,
std::chrono::milliseconds timeout);
+ /**
+ * Schedule the specified Callback to be invoked after the
+ * fefault timeout interval.
+ *
+ * If the callback is already scheduled, this cancels the existing timeout
+ * before scheduling the new timeout.
+ *
+ * This method uses CHECK() to make sure that the default timeout was
+ * specified on the object initialization.
+ */
+ void scheduleTimeout(Callback* callback);
+
template <class F>
void scheduleTimeoutFn(F fn, std::chrono::milliseconds timeout) {
struct Wrapper : Callback {
virtual void timeoutExpired() noexcept;
std::chrono::milliseconds interval_;
+ std::chrono::milliseconds defaultTimeout_;
static constexpr int WHEEL_BUCKETS = 4;
static constexpr int WHEEL_BITS = 8;