diff options
author | Abseil Team <absl-team@google.com> | 2017-12-15T19·12-0800 |
---|---|---|
committer | Ashley Hedberg <ahedberg@google.com> | 2017-12-18T15·00-0500 |
commit | 4972c72c5cf2f27e2a0846ce9ff5d377d3f2b7af (patch) | |
tree | c95abdf920010c988925dbc22d11eb789552534d /absl/synchronization/lifetime_test.cc | |
parent | 6280bddf55e675219cacc25a6a12bc5ddc0fdc74 (diff) |
Changes imported from Abseil "staging" branch:
- f59c2332341d6b1a3e045d61eb0065f7a226f807 Avoid preprocessing '__CUDACC_VER__ >= 70000' on CUDA 9,... by Abseil Team <absl-team@google.com> - 12dd22cf967603e9a12d58abfe877989d61844e3 Internal change. by Greg Falcon <gfalcon@google.com> GitOrigin-RevId: f59c2332341d6b1a3e045d61eb0065f7a226f807 Change-Id: If4f5274e6d638a2ac86f1377e6ac0481dc584f19
Diffstat (limited to 'absl/synchronization/lifetime_test.cc')
-rw-r--r-- | absl/synchronization/lifetime_test.cc | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/absl/synchronization/lifetime_test.cc b/absl/synchronization/lifetime_test.cc index 6aea60e1362f..a3e2701f9208 100644 --- a/absl/synchronization/lifetime_test.cc +++ b/absl/synchronization/lifetime_test.cc @@ -69,8 +69,22 @@ void ThreadTwo(absl::Mutex* mutex, absl::CondVar* condvar, } // Launch thread 1 and thread 2, and block on their completion. +// If any of 'mutex', 'condvar', or 'notification' is nullptr, use a locally +// constructed instance instead. void RunTests(absl::Mutex* mutex, absl::CondVar* condvar, absl::Notification* notification) { + absl::Mutex default_mutex; + absl::CondVar default_condvar; + absl::Notification default_notification; + if (!mutex) { + mutex = &default_mutex; + } + if (!condvar) { + condvar = &default_condvar; + } + if (!notification) { + notification = &default_notification; + } bool state = false; std::thread thread_one(ThreadOne, mutex, condvar, notification, &state); std::thread thread_two(ThreadTwo, mutex, condvar, notification, &state); @@ -85,6 +99,33 @@ void TestLocals() { RunTests(&mutex, &condvar, ¬ification); } +// Global variables during start and termination +// +// In a translation unit, static storage duration variables are initialized in +// the order of their definitions, and destroyed in the reverse order of their +// definitions. We can use this to arrange for tests to be run on these objects +// before they are created, and after they are destroyed. + +class ConstructorTestRunner { + public: + ConstructorTestRunner(absl::Mutex* mutex, absl::CondVar* condvar, + absl::Notification* notification) { + RunTests(mutex, condvar, notification); + } +}; + +class DestructorTestRunner { + public: + DestructorTestRunner(absl::Mutex* mutex, absl::CondVar* condvar, + absl::Notification* notification) + : mutex_(mutex), condvar_(condvar), notification_(notification) {} + ~DestructorTestRunner() { RunTests(mutex_, condvar_, notification_); } + private: + absl::Mutex* mutex_; + absl::CondVar* condvar_; + absl::Notification* notification_; +}; + } // namespace int main() { |