diff options
author | jgm <jgm@google.com> | 2012-01-27 21:26:58 +0000 |
---|---|---|
committer | jgm <jgm@google.com> | 2012-01-27 21:26:58 +0000 |
commit | cfb40870bc74dc57616e286461a89c9f259b349d (patch) | |
tree | 67cb21a58f634a2c021726f5a0288683e62b95cb /include/gtest/internal/gtest-port.h | |
parent | 4d6f296e8e5d3f839ef4868390bbec27cb12e068 (diff) | |
download | googletest-cfb40870bc74dc57616e286461a89c9f259b349d.tar.gz googletest-cfb40870bc74dc57616e286461a89c9f259b349d.tar.bz2 googletest-cfb40870bc74dc57616e286461a89c9f259b349d.zip |
Locking for Notification class.
Diffstat (limited to 'include/gtest/internal/gtest-port.h')
-rw-r--r-- | include/gtest/internal/gtest-port.h | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/include/gtest/internal/gtest-port.h b/include/gtest/internal/gtest-port.h index 3c8463bc..8c96f313 100644 --- a/include/gtest/internal/gtest-port.h +++ b/include/gtest/internal/gtest-port.h @@ -1102,22 +1102,37 @@ inline void SleepMilliseconds(int n) { // use it in user tests, either directly or indirectly. class Notification { public: - Notification() : notified_(false) {} + Notification() : notified_(false) { + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL)); + } + ~Notification() { + pthread_mutex_destroy(&mutex_); + } // Notifies all threads created with this notification to start. Must // be called from the controller thread. - void Notify() { notified_ = true; } + void Notify() { + pthread_mutex_lock(&mutex_); + notified_ = true; + pthread_mutex_unlock(&mutex_); + } // Blocks until the controller thread notifies. Must be called from a test // thread. void WaitForNotification() { - while (!notified_) { + for (;;) { + pthread_mutex_lock(&mutex_); + const bool notified = notified_; + pthread_mutex_unlock(&mutex_); + if (notified) + break; SleepMilliseconds(10); } } private: - volatile bool notified_; + pthread_mutex_t mutex_; + bool notified_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); }; |