27 #include "absl/memory/memory.h"
28 #include "absl/time/time.h"
29 #include "absl/types/optional.h"
38 namespace iomgr_engine {
41 class ThreadCollector {
43 ThreadCollector() =
default;
46 void Collect(std::vector<grpc_core::Thread>
threads) {
55 ThreadCollector::~ThreadCollector() {
72 std::vector<experimental::EventEngine::Closure*> timers) {
74 ThreadCollector collector;
80 if (waiter_count_ == 0) {
90 if (!has_timed_waiter_) {
95 for (
auto*
timer : timers) {
100 collector.Collect(
std::move(completed_threads_));
113 if (forking_)
return false;
137 uint64_t my_timed_waiter_generation = timed_waiter_generation_ - 1;
145 if (!has_timed_waiter_ || (
next < timed_waiter_deadline_)) {
146 my_timed_waiter_generation = ++timed_waiter_generation_;
147 has_timed_waiter_ =
true;
148 timed_waiter_deadline_ =
next;
160 if (my_timed_waiter_generation == timed_waiter_generation_) {
162 has_timed_waiter_ =
false;
178 if (!check_result->empty()) {
203 thread->self->thread_count_--;
206 thread->self->cv_.Signal();
236 ThreadCollector collector;
238 collector.Collect(
std::move(completed_threads_));
239 if (thread_count_ == 0)
break;
248 has_timed_waiter_ =
false;
250 ++timed_waiter_generation_;
264 ThreadCollector collector;
265 collector.Collect(
std::move(completed_threads_));
266 if (thread_count_ == 0)
break;