diff options
-rw-r--r-- | include/grpc++/impl/sync.h | 3 | ||||
-rw-r--r-- | include/grpc++/impl/sync_no_cxx11.h | 13 | ||||
-rw-r--r-- | include/grpc++/impl/thd.h | 3 | ||||
-rw-r--r-- | include/grpc++/impl/thd_no_cxx11.h | 16 |
4 files changed, 22 insertions, 13 deletions
diff --git a/include/grpc++/impl/sync.h b/include/grpc++/impl/sync.h index 64d1003685..2f41d2bdeb 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 3bf4fb8e3d..5636373b81 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 6a4c86a490..4c4578a92d 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 f54cc1b6de..a01b931df8 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 |