diff --git a/include/grpc++/impl/sync.h b/include/grpc++/impl/sync.h index 64d1003685ef1025d342604f61cd660c26f1a4c2..2f41d2bdebb8b73c0fa3137ceaf650370393bead 100644 --- a/include/grpc++/impl/sync.h +++ b/include/grpc++/impl/sync.h @@ -37,10 +37,9 @@ #include <grpc++/config.h> #ifdef GRPC_CXX0X_NO_THREAD -#include <grpc++/impl/sync_nocxx11.h> +#include <grpc++/impl/sync_no_cxx11.h> #else #include <grpc++/impl/sync_cxx11.h> - #endif #endif // GRPCXX_IMPL_SYNC_H diff --git a/include/grpc++/impl/sync_no_cxx11.h b/include/grpc++/impl/sync_no_cxx11.h index 3bf4fb8e3d327b4f611461d27a8fd11481d0cbe2..5636373b8141638204ffbb19d30c9f2a3d02fa80 100644 --- a/include/grpc++/impl/sync_no_cxx11.h +++ b/include/grpc++/impl/sync_no_cxx11.h @@ -56,13 +56,14 @@ class mutex { template <class mutex> class lock_guard { public: - lock_guard(mutex &mu) : mu_(mu), locked(true) { gpr_mu_lock(&mu.mu_); } - ~lock_guard() { unlock(); } - void lock() { + lock_guard(mutex &mu) : mu_(mu), locked(true) { gpr_mu_lock(&mu.mu_); } + ~lock_guard() { unlock_internal(); } + protected: + void lock_internal() { if (!locked) gpr_mu_lock(&mu_.mu_); locked = true; } - void unlock() { + void unlock_internal() { if (locked) gpr_mu_unlock(&mu_.mu_); locked = false; } @@ -75,7 +76,9 @@ class lock_guard { template <class mutex> class unique_lock : public lock_guard<mutex> { public: - unique_lock(mutex &mu) : lock_guard(mu) { } + unique_lock(mutex &mu) : lock_guard(mu) { } + void lock() { lock_internal(); } + void unlock() { unlock_internal(); } }; class condition_variable { diff --git a/include/grpc++/impl/thd.h b/include/grpc++/impl/thd.h index 6a4c86a490377d60f4ffae46684a45e18b8b1680..4c4578a92da142bfaef648b4b4cb1d69aaa58add 100644 --- a/include/grpc++/impl/thd.h +++ b/include/grpc++/impl/thd.h @@ -37,10 +37,9 @@ #include <grpc++/config.h> #ifdef GRPC_CXX0X_NO_THREAD -#include <grpc++/impl/thd_nocxx11.h> +#include <grpc++/impl/thd_no_cxx11.h> #else #include <grpc++/impl/thd_cxx11.h> - #endif #endif // GRPCXX_IMPL_THD_H diff --git a/include/grpc++/impl/thd_no_cxx11.h b/include/grpc++/impl/thd_no_cxx11.h index f54cc1b6dee804ad3f3f79b7f3acf7f10b40ba0d..a01b931df86f6de027ecd111c474b25ab6a5e5ad 100644 --- a/include/grpc++/impl/thd_no_cxx11.h +++ b/include/grpc++/impl/thd_no_cxx11.h @@ -42,15 +42,22 @@ class thread { public: template<class T> thread(void (T::*fptr)(), T *obj) { func_ = new thread_function<T>(fptr, obj); + joined_ = false; start(); } - ~thread() { delete func_; } - void join() { gpr_thd_join(thd); } + ~thread() { + if (!joined_) std::terminate(); + delete func_; + } + void join() { + gpr_thd_join(thd_); + joined_ = true; + } private: void start() { gpr_thd_options options = gpr_thd_options_default(); gpr_thd_options_set_joinable(&options); - gpr_thd_new(&thd, thread_func, (void *) func_, &options); + gpr_thd_new(&thd_, thread_func, (void *) func_, &options); } static void thread_func(void *arg) { thread_function_base *func = (thread_function_base *) arg; @@ -73,7 +80,8 @@ class thread { T *obj_; }; thread_function_base *func_; - gpr_thd_id thd; + gpr_thd_id thd_; + bool joined_; }; } // namespace grpc