diff options
author | Vijay Pai <vpai@google.com> | 2018-02-16 22:59:03 -0800 |
---|---|---|
committer | Vijay Pai <vpai@google.com> | 2018-02-19 22:39:58 -0800 |
commit | da69355f30ca6863cc07c0aebffc5a14900de265 (patch) | |
tree | 83c866fcf54b2c058d452312109175cbb2107865 /test/core/gprpp | |
parent | 5e1298f0a826777b0e5b844328b81216e9c37476 (diff) |
C++ize gpr_thread as grpc_core::Thread, make it 2-phase init (construct/Start)
Diffstat (limited to 'test/core/gprpp')
-rw-r--r-- | test/core/gprpp/manual_constructor_test.cc | 1 | ||||
-rw-r--r-- | test/core/gprpp/thd_test.cc | 101 |
2 files changed, 101 insertions, 1 deletions
diff --git a/test/core/gprpp/manual_constructor_test.cc b/test/core/gprpp/manual_constructor_test.cc index 74777fe11c..af162ae8e8 100644 --- a/test/core/gprpp/manual_constructor_test.cc +++ b/test/core/gprpp/manual_constructor_test.cc @@ -26,7 +26,6 @@ #include <stdlib.h> #include <cstring> -#include "src/core/lib/gpr/thd.h" #include "src/core/lib/gprpp/abstract.h" #include "test/core/util/test_config.h" diff --git a/test/core/gprpp/thd_test.cc b/test/core/gprpp/thd_test.cc new file mode 100644 index 0000000000..d98f617288 --- /dev/null +++ b/test/core/gprpp/thd_test.cc @@ -0,0 +1,101 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * 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. + * + */ + +/* Test of gpr thread support. */ + +#include "src/core/lib/gprpp/thd.h" + +#include <new> +#include <stdio.h> +#include <stdlib.h> + +#include <grpc/support/log.h> +#include <grpc/support/sync.h> +#include <grpc/support/time.h> + +#include "test/core/util/test_config.h" + +#define NUM_THREADS 300 + +struct test { + gpr_mu mu; + int n; + int is_done; + gpr_cv done_cv; +}; + +/* A Thread body. Decrement t->n, and if is becomes zero, set t->done. */ +static void thd_body1(void* v) { + struct test* t = static_cast<struct test*>(v); + gpr_mu_lock(&t->mu); + t->n--; + if (t->n == 0) { + t->is_done = 1; + gpr_cv_signal(&t->done_cv); + } + gpr_mu_unlock(&t->mu); +} + +/* Test that we can create a number of threads, wait for them, and join them. */ +static void test1(void) { + grpc_core::Thread thds[NUM_THREADS]; + struct test t; + gpr_mu_init(&t.mu); + gpr_cv_init(&t.done_cv); + t.n = NUM_THREADS; + t.is_done = 0; + for (auto& th: thds) { + new (&th) grpc_core::Thread("grpc_thread_body1_test", &thd_body1, &t); + th.Start(); + } + gpr_mu_lock(&t.mu); + while (!t.is_done) { + gpr_cv_wait(&t.done_cv, &t.mu, gpr_inf_future(GPR_CLOCK_REALTIME)); + } + gpr_mu_unlock(&t.mu); + for (auto& th: thds) { + th.Join(); + } + GPR_ASSERT(t.n == 0); +} + +static void thd_body2(void* v) {} + +/* Test that we can create a number of threads and join them. */ +static void test2(void) { + grpc_core::Thread thds[NUM_THREADS]; + for (auto& th: thds) { + bool ok; + new (&th) grpc_core::Thread("grpc_thread_body2_test", &thd_body2, + nullptr, &ok); + GPR_ASSERT(ok); + th.Start(); + } + for (auto& th: thds) { + th.Join(); + } +} + +/* ------------------------------------------------- */ + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + test1(); + test2(); + return 0; +} |