proxygen
folly::fibers::TimeoutController Class Reference

#include <TimeoutController.h>

Inheritance diagram for folly::fibers::TimeoutController:

Classes

struct  TimeoutHandle
 

Public Types

typedef std::chrono::steady_clock Clock
 
typedef std::chrono::time_point< ClockTimePoint
 
typedef Clock::duration Duration
 

Public Member Functions

 TimeoutController (LoopController &loopController)
 
intptr_t registerTimeout (std::function< void()> f, Duration duration)
 
void cancel (intptr_t id)
 
void runTimeouts (TimePoint time)
 

Private Types

typedef std::queue< TimeoutHandleTimeoutHandleList
 
typedef std::unique_ptr< TimeoutHandleListTimeoutHandleListPtr
 

Private Member Functions

void scheduleRun ()
 

Private Attributes

std::vector< std::pair< Duration, TimeoutHandleListPtr > > timeoutHandleBuckets_
 
TimePoint nextTimeout_
 
LoopControllerloopController_
 

Detailed Description

Definition at line 32 of file TimeoutController.h.

Member Typedef Documentation

typedef std::chrono::steady_clock folly::fibers::TimeoutController::Clock

Definition at line 35 of file TimeoutController.h.

Definition at line 37 of file TimeoutController.h.

Definition at line 49 of file TimeoutController.h.

Definition at line 51 of file TimeoutController.h.

typedef std::chrono::time_point<Clock> folly::fibers::TimeoutController::TimePoint

Definition at line 36 of file TimeoutController.h.

Constructor & Destructor Documentation

folly::fibers::TimeoutController::TimeoutController ( LoopController loopController)
explicit

Definition at line 22 of file TimeoutController.cpp.

23  : nextTimeout_(TimePoint::max()), loopController_(loopController) {}
LogLevel max
Definition: LogLevel.cpp:31

Member Function Documentation

void folly::fibers::TimeoutController::cancel ( intptr_t  id)

Definition at line 97 of file TimeoutController.cpp.

References folly::fibers::TimeoutController::TimeoutHandle::canceled, and bm::list.

97  {
98  auto handle = reinterpret_cast<TimeoutHandle*>(p);
99  handle->canceled = true;
100 
101  auto& list = handle->list;
102 
103  while (!list.empty() && list.front().canceled) {
104  list.pop();
105  }
106 }
Encoder::MutableCompressedList list
intptr_t folly::fibers::TimeoutController::registerTimeout ( std::function< void()>  f,
Duration  duration 
)

Definition at line 25 of file TimeoutController.cpp.

References f, bm::list, folly::gen::move, nextTimeout_, now(), scheduleRun(), folly::detail::timeout, and timeoutHandleBuckets_.

27  {
28  auto& list = [&]() -> TimeoutHandleList& {
29  for (auto& bucket : timeoutHandleBuckets_) {
30  if (bucket.first == duration) {
31  return *bucket.second;
32  }
33  }
34 
35  timeoutHandleBuckets_.emplace_back(
36  duration, std::make_unique<TimeoutHandleList>());
37  return *timeoutHandleBuckets_.back().second;
38  }();
39 
40  auto timeout = Clock::now() + duration;
41  list.emplace(std::move(f), timeout, list);
42 
43  if (timeout < nextTimeout_) {
45  scheduleRun();
46  }
47 
48  return reinterpret_cast<intptr_t>(&list.back());
49 }
auto f
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::chrono::steady_clock::time_point now()
std::vector< std::pair< Duration, TimeoutHandleListPtr > > timeoutHandleBuckets_
Encoder::MutableCompressedList list
std::queue< TimeoutHandle > TimeoutHandleList
void folly::fibers::TimeoutController::runTimeouts ( TimePoint  time)

Definition at line 51 of file TimeoutController.cpp.

References bm::list, max, min, nextTimeout_, now(), scheduleRun(), folly::detail::distributed_mutex::time(), and timeoutHandleBuckets_.

51  {
52  auto now = Clock::now();
53  // Make sure we don't skip some events if function was run before actual time.
54  if (time < now) {
55  time = now;
56  }
57  if (nextTimeout_ > time) {
58  return;
59  }
60 
62 
63  for (auto& bucket : timeoutHandleBuckets_) {
64  auto& list = *bucket.second;
65 
66  while (!list.empty()) {
67  if (!list.front().canceled) {
68  if (list.front().timeout > time) {
69  nextTimeout_ = std::min(nextTimeout_, list.front().timeout);
70  break;
71  }
72 
73  list.front().func();
74  }
75  list.pop();
76  }
77  }
78 
79  if (nextTimeout_ != TimePoint::max()) {
80  scheduleRun();
81  }
82 }
LogLevel max
Definition: LogLevel.cpp:31
std::chrono::steady_clock::time_point now()
std::vector< std::pair< Duration, TimeoutHandleListPtr > > timeoutHandleBuckets_
LogLevel min
Definition: LogLevel.cpp:30
Encoder::MutableCompressedList list
std::chrono::nanoseconds time()
void folly::fibers::TimeoutController::scheduleRun ( )
private

Definition at line 84 of file TimeoutController.cpp.

References loopController_, nextTimeout_, folly::detail::distributed_mutex::time(), and folly::fibers::LoopController::timedSchedule().

Referenced by registerTimeout(), and runTimeouts().

84  {
85  auto time = nextTimeout_;
86  std::weak_ptr<TimeoutController> timeoutControllerWeak = shared_from_this();
87 
89  [timeoutControllerWeak, time]() {
90  if (auto timeoutController = timeoutControllerWeak.lock()) {
91  timeoutController->runTimeouts(time);
92  }
93  },
94  time);
95 }
virtual void timedSchedule(std::function< void()> func, TimePoint time)=0
std::chrono::nanoseconds time()

Member Data Documentation

LoopController& folly::fibers::TimeoutController::loopController_
private

Definition at line 68 of file TimeoutController.h.

Referenced by scheduleRun().

TimePoint folly::fibers::TimeoutController::nextTimeout_
private

Definition at line 67 of file TimeoutController.h.

Referenced by registerTimeout(), runTimeouts(), and scheduleRun().

std::vector<std::pair<Duration, TimeoutHandleListPtr> > folly::fibers::TimeoutController::timeoutHandleBuckets_
private

Definition at line 66 of file TimeoutController.h.

Referenced by registerTimeout(), and runTimeouts().


The documentation for this class was generated from the following files: