24 #include <gtest/gtest.h>
26 #include "absl/memory/memory.h"
27 #include "absl/synchronization/barrier.h"
28 #include "absl/synchronization/notification.h"
42 TEST(WorkSerializerTest, ExecuteOneRun) {
52 TEST(WorkSerializerTest, ExecuteOneScheduleAndDrain) {
67 : lock_(lock),
thread_(
"grpc_execute_many", ExecuteManyLoop, this) {
79 static void ExecuteManyLoop(
void*
arg) {
80 TestThread*
self =
static_cast<TestThread*
>(
arg);
82 for (
size_t i = 0;
i < 10;
i++) {
83 for (
size_t j = 0;
j < 10000;
j++) {
84 struct ExecutionArgs {
88 ExecutionArgs*
c =
new ExecutionArgs;
89 c->counter = &
self->counter_;
94 *
c->counter =
c->value;
113 TEST(WorkSerializerTest, ExecuteMany) {
116 std::vector<std::unique_ptr<TestThread>>
threads;
117 for (
size_t i = 0;
i < 100; ++
i) {
118 threads.push_back(absl::make_unique<TestThread>(&lock));
123 class TestThreadScheduleAndDrain {
126 : lock_(lock),
thread_(
"grpc_execute_many", ExecuteManyLoop, this) {
131 ~TestThreadScheduleAndDrain() {
138 static void ExecuteManyLoop(
void*
arg) {
139 TestThreadScheduleAndDrain*
self =
140 static_cast<TestThreadScheduleAndDrain*
>(
arg);
142 for (
size_t i = 0;
i < 10;
i++) {
143 for (
size_t j = 0;
j < 10000;
j++) {
144 struct ExecutionArgs {
148 ExecutionArgs*
c =
new ExecutionArgs;
149 c->counter = &
self->counter_;
151 self->lock_->Schedule(
154 *
c->counter =
c->value;
159 self->lock_->DrainQueue();
174 TEST(WorkSerializerTest, ExecuteManyScheduleAndDrain) {
177 std::vector<std::unique_ptr<TestThreadScheduleAndDrain>>
threads;
178 for (
size_t i = 0;
i < 100; ++
i) {
179 threads.push_back(absl::make_unique<TestThreadScheduleAndDrain>(&lock));
184 TEST(WorkSerializerTest, ExecuteManyMixedRunScheduleAndDrain) {
187 std::vector<std::unique_ptr<TestThread>> run_threads;
188 std::vector<std::unique_ptr<TestThreadScheduleAndDrain>> schedule_threads;
189 for (
size_t i = 0;
i < 50; ++
i) {
190 run_threads.push_back(absl::make_unique<TestThread>(&lock));
191 schedule_threads.push_back(
192 absl::make_unique<TestThreadScheduleAndDrain>(&lock));
198 TEST(WorkSerializerTest, CallbackDestroysWorkSerializer) {
199 auto lock = std::make_shared<grpc_core::WorkSerializer>();
205 TEST(WorkSerializerTest, WorkSerializerDestructionRace) {
206 for (
int i = 0;
i < 1000; ++
i) {
207 auto lock = std::make_shared<grpc_core::WorkSerializer>();
220 TEST(WorkSerializerTest, WorkSerializerDestructionRaceMultipleThreads) {
221 auto lock = std::make_shared<grpc_core::WorkSerializer>();
223 std::vector<std::thread>
threads;
225 for (
int i = 0;
i < 50; ++
i) {
226 threads.emplace_back([lock, &barrier]()
mutable {
240 int main(
int argc,
char** argv) {