Fix copyright lines
[folly.git] / folly / io / async / TimeoutManager.h
index fb3a1b0e74dd6c5acf7e409269b8090d6b484f0f..e3093178187a4225d27034ba1a7a4f169a7f763f 100644 (file)
@@ -1,27 +1,25 @@
 /*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2014-present Facebook, Inc.
  *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
+
 #pragma once
 
 #include <chrono>
-#include <stdint.h>
+#include <cstdint>
+
+#include <folly/Function.h>
 
 namespace folly {
 
@@ -34,12 +32,17 @@ class AsyncTimeout;
  */
 class TimeoutManager {
  public:
+  typedef std::chrono::milliseconds timeout_type;
+  using Func = folly::Function<void()>;
+
   enum class InternalEnum {
     INTERNAL,
     NORMAL
   };
 
-  virtual ~TimeoutManager() {}
+  TimeoutManager();
+
+  virtual ~TimeoutManager();
 
   /**
    * Attaches/detaches TimeoutManager to AsyncTimeout
@@ -52,7 +55,7 @@ class TimeoutManager {
    * Schedules AsyncTimeout to fire after `timeout` milliseconds
    */
   virtual bool scheduleTimeout(AsyncTimeout* obj,
-                               std::chrono::milliseconds timeout) = 0;
+                               timeout_type timeout) = 0;
 
   /**
    * Cancels the AsyncTimeout, if scheduled
@@ -63,13 +66,41 @@ class TimeoutManager {
    * This is used to mark the beginning of a new loop cycle by the
    * first handler fired within that cycle.
    */
-  virtual bool bumpHandlingTime() = 0;
+  virtual void bumpHandlingTime() = 0;
 
   /**
    * Helper method to know whether we are running in the timeout manager
    * thread
    */
   virtual bool isInTimeoutManagerThread() = 0;
+
+  /**
+   * Runs the given Cob at some time after the specified number of
+   * milliseconds.  (No guarantees exactly when.)
+   *
+   * Throws a std::system_error if an error occurs.
+   */
+  void runAfterDelay(
+      Func cob,
+      uint32_t milliseconds,
+      InternalEnum internal = InternalEnum::NORMAL);
+
+  /**
+   * @see tryRunAfterDelay for more details
+   *
+   * @return  true iff the cob was successfully registered.
+   */
+  bool tryRunAfterDelay(
+      Func cob,
+      uint32_t milliseconds,
+      InternalEnum internal = InternalEnum::NORMAL);
+
+ protected:
+  void clearCobTimeouts();
+
+ private:
+  struct CobTimeouts;
+  std::unique_ptr<CobTimeouts> cobTimeouts_;
 };
 
-} // folly
+} // namespace folly