event_engine/iomgr_engine/timer_manager.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2017 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H
20 #define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H
21 
23 
24 #include <stddef.h>
25 #include <stdint.h>
26 
27 #include <memory>
28 #include <vector>
29 
30 #include "absl/base/thread_annotations.h"
31 
33 
37 #include "src/core/lib/gprpp/thd.h"
39 
40 namespace grpc_event_engine {
41 namespace iomgr_engine {
42 
43 // Timer Manager tries to keep only one thread waiting for the next timeout at
44 // all times, and thus effectively preventing the thundering herd problem.
45 // TODO(ctiller): consider unifying this thread pool and the one in
46 // thread_pool.{h,cc}.
48  public:
49  TimerManager();
50  ~TimerManager() override;
51 
53 
54  void TimerInit(Timer* timer, grpc_core::Timestamp deadline,
56  bool TimerCancel(Timer* timer);
57 
58  // Forkable
59  void PrepareFork() override;
60  void PostforkParent() override;
61  void PostforkChild() override;
62 
63  private:
64  struct RunThreadArgs {
65  TimerManager* self;
67  };
68 
69  class Host final : public TimerListHost {
70  public:
71  explicit Host(TimerManager* timer_manager)
72  : timer_manager_(timer_manager) {}
73 
74  void Kick() override;
75  grpc_core::Timestamp Now() override;
76 
77  private:
79  };
80 
82  static void RunThread(void* arg);
83  void MainLoop();
84  void RunSomeTimers(std::vector<experimental::EventEngine::Closure*> timers);
86  void Kick();
87 
89  grpc_core::CondVar cv_;
91  // number of threads in the system
92  size_t thread_count_ ABSL_GUARDED_BY(mu_) = 0;
93  // number of threads sitting around waiting
94  size_t waiter_count_ ABSL_GUARDED_BY(mu_) = 0;
95  // Threads waiting to be joined
96  std::vector<grpc_core::Thread> completed_threads_ ABSL_GUARDED_BY(mu_);
97  // is there a thread waiting until the next timer should fire?
98  bool has_timed_waiter_ ABSL_GUARDED_BY(mu_) = false;
99  // are we shutting down?
101  // are we forking?
102  bool forking_ ABSL_GUARDED_BY(mu_) = false;
103  // are we shutting down?
104  bool kicked_ ABSL_GUARDED_BY(mu_) = false;
105  // the deadline of the current timed waiter thread (only relevant if
106  // has_timed_waiter_ is true)
107  grpc_core::Timestamp timed_waiter_deadline_ ABSL_GUARDED_BY(mu_);
108  // generation counter to track which thread is waiting for the next timer
109  uint64_t timed_waiter_generation_ ABSL_GUARDED_BY(mu_) = 0;
110  // number of timer wakeups
112  // actual timer implementation
113  std::unique_ptr<TimerList> timer_list_;
115 };
116 
117 } // namespace iomgr_engine
118 } // namespace grpc_event_engine
119 
120 #endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H */
grpc_event_engine::iomgr_engine::TimerManager::Host::Kick
void Kick() override
Definition: event_engine/iomgr_engine/timer_manager.cc:244
grpc_event_engine::iomgr_engine::TimerManager::Kick
void Kick()
Definition: event_engine/iomgr_engine/timer_manager.cc:246
grpc_event_engine::iomgr_engine::TimerManager::StartThread
void StartThread() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_)
Definition: event_engine/iomgr_engine/timer_manager.cc:60
grpc_event_engine::iomgr_engine::TimerManager::MainLoop
void MainLoop()
Definition: event_engine/iomgr_engine/timer_manager.cc:172
grpc_event_engine::iomgr_engine::TimerManager::prefork_thread_count_
int prefork_thread_count_
Definition: event_engine/iomgr_engine/timer_manager.h:114
grpc_event_engine::iomgr_engine::TimerManager::Now
grpc_core::Timestamp Now()
Definition: event_engine/iomgr_engine/timer_manager.h:52
grpc_event_engine::iomgr_engine::TimerManager::~TimerManager
~TimerManager() override
Definition: event_engine/iomgr_engine/timer_manager.cc:229
Timestamp
Definition: bloaty/third_party/protobuf/src/google/protobuf/timestamp.pb.h:69
false
#define false
Definition: setup_once.h:323
grpc_event_engine::iomgr_engine::TimerManager::RunSomeTimers
void RunSomeTimers(std::vector< experimental::EventEngine::Closure * > timers)
Definition: event_engine/iomgr_engine/timer_manager.cc:71
grpc_core
Definition: call_metric_recorder.h:31
grpc_event_engine::iomgr_engine::TimerManager::Host::Host
Host(TimerManager *timer_manager)
Definition: event_engine/iomgr_engine/timer_manager.h:71
event_engine.h
grpc_core::Timestamp
Definition: src/core/lib/gprpp/time.h:62
grpc_event_engine::iomgr_engine::TimerManager
Definition: event_engine/iomgr_engine/timer_manager.h:47
grpc_event_engine::iomgr_engine::TimerManager::TimerInit
void TimerInit(Timer *timer, grpc_core::Timestamp deadline, experimental::EventEngine::Closure *closure)
Definition: event_engine/iomgr_engine/timer_manager.cc:220
grpc_event_engine::iomgr_engine::TimerManager::WaitUntil
bool WaitUntil(grpc_core::Timestamp next)
Definition: event_engine/iomgr_engine/timer_manager.cc:109
grpc_event_engine::iomgr_engine::TimerManager::RunThreadArgs
Definition: event_engine/iomgr_engine/timer_manager.h:64
grpc_event_engine::iomgr_engine::TimerManager::cv_
grpc_core::CondVar cv_
Definition: event_engine/iomgr_engine/timer_manager.h:89
wakeups_
std::vector< uint32_t > wakeups_
Definition: filter_fuzzer.cc:572
grpc_event_engine::iomgr_engine::TimerManager::PostforkParent
void PostforkParent() override
Definition: event_engine/iomgr_engine/timer_manager.cc:271
grpc_event_engine::iomgr_engine::TimerManager::Host
Definition: event_engine/iomgr_engine/timer_manager.h:69
grpc_event_engine::iomgr_engine::TimerList
Definition: event_engine/iomgr_engine/timer.h:73
grpc_event_engine::iomgr_engine::TimerManager::TimerManager
TimerManager()
Definition: event_engine/iomgr_engine/timer_manager.cc:209
ABSL_EXCLUSIVE_LOCKS_REQUIRED
#define ABSL_EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: abseil-cpp/absl/base/thread_annotations.h:145
grpc_event_engine::iomgr_engine::TimerManager::mu_
grpc_core::Mutex mu_
Definition: event_engine/iomgr_engine/timer_manager.h:88
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
grpc_event_engine::iomgr_engine::TimerManager::PrepareFork
void PrepareFork() override
Definition: event_engine/iomgr_engine/timer_manager.cc:255
arg
Definition: cmdline.cc:40
time.h
grpc_event_engine::iomgr_engine::TimerManager::RunThreadArgs::thread
grpc_core::Thread thread
Definition: event_engine/iomgr_engine/timer_manager.h:66
grpc_event_engine::iomgr_engine::TimerManager::Host::Now
grpc_core::Timestamp Now() override
Definition: event_engine/iomgr_engine/timer_manager.cc:215
stdint.h
grpc_event_engine::iomgr_engine::TimerManager::RunThread
static void RunThread(void *arg)
Definition: event_engine/iomgr_engine/timer_manager.cc:198
grpc_event_engine::iomgr_engine::Timer
Definition: event_engine/iomgr_engine/timer.h:44
grpc_event_engine::iomgr_engine::TimerManager::ABSL_GUARDED_BY
size_t thread_count_ ABSL_GUARDED_BY(mu_)=0
grpc_event_engine::experimental::Forkable
Definition: forkable.h:40
shutdown_
bool shutdown_
Definition: pick_first.cc:173
grpc_event_engine::experimental::EventEngine::Closure
Definition: event_engine.h:87
grpc_event_engine::iomgr_engine::TimerManager::host_
Host host_
Definition: event_engine/iomgr_engine/timer_manager.h:90
google::protobuf.internal::Mutex
WrappedMutex Mutex
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/mutex.h:113
next
AllocList * next[kMaxLevel]
Definition: abseil-cpp/absl/base/internal/low_level_alloc.cc:100
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc_event_engine
Definition: endpoint_config.h:24
thd.h
closure
Definition: proxy.cc:59
grpc_core::Thread
Definition: thd.h:43
grpc_event_engine::iomgr_engine::TimerManager::PostforkChild
void PostforkChild() override
Definition: event_engine/iomgr_engine/timer_manager.cc:280
grpc_event_engine::iomgr_engine::TimerManager::Host::timer_manager_
TimerManager *const timer_manager_
Definition: event_engine/iomgr_engine/timer_manager.h:78
grpc_event_engine::iomgr_engine::TimerManager::TimerCancel
bool TimerCancel(Timer *timer)
Definition: event_engine/iomgr_engine/timer_manager.cc:225
sync.h
timer.h
forkable.h
timer
static uv_timer_t timer
Definition: test-callback-stack.c:34
grpc_event_engine::iomgr_engine::TimerListHost
Definition: event_engine/iomgr_engine/timer.h:61
port_platform.h
grpc_event_engine::iomgr_engine::TimerManager::timer_list_
std::unique_ptr< TimerList > timer_list_
Definition: event_engine/iomgr_engine/timer_manager.h:113


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:38