diff options
author | Abseil Team <absl-team@google.com> | 2017-12-15 11:12:12 -0800 |
---|---|---|
committer | Ashley Hedberg <ahedberg@google.com> | 2017-12-18 10:00:09 -0500 |
commit | 4972c72c5cf2f27e2a0846ce9ff5d377d3f2b7af (patch) | |
tree | c95abdf920010c988925dbc22d11eb789552534d /absl/synchronization | |
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')
-rw-r--r-- | absl/synchronization/internal/create_thread_identity.cc | 1 | ||||
-rw-r--r-- | absl/synchronization/internal/graphcycles.cc | 1 | ||||
-rw-r--r-- | absl/synchronization/lifetime_test.cc | 41 | ||||
-rw-r--r-- | absl/synchronization/mutex.cc | 1 | ||||
-rw-r--r-- | absl/synchronization/mutex.h | 1 |
5 files changed, 44 insertions, 1 deletions
diff --git a/absl/synchronization/internal/create_thread_identity.cc b/absl/synchronization/internal/create_thread_identity.cc index 0134a439..e7a65cd8 100644 --- a/absl/synchronization/internal/create_thread_identity.cc +++ b/absl/synchronization/internal/create_thread_identity.cc @@ -21,6 +21,7 @@ #include <string.h> +#include "absl/base/attributes.h" #include "absl/base/internal/spinlock.h" #include "absl/base/internal/thread_identity.h" #include "absl/synchronization/internal/per_thread_sem.h" diff --git a/absl/synchronization/internal/graphcycles.cc b/absl/synchronization/internal/graphcycles.cc index d7ae0cf3..9bc9c8a0 100644 --- a/absl/synchronization/internal/graphcycles.cc +++ b/absl/synchronization/internal/graphcycles.cc @@ -28,6 +28,7 @@ // (2) When a new edge (x->y) is inserted, do nothing if rank[x] < rank[y]. // (3) Otherwise: adjust ranks in the neighborhood of x and y. +#include "absl/base/attributes.h" // This file is a no-op if the required LowLevelAlloc support is missing. #include "absl/base/internal/low_level_alloc.h" #ifndef ABSL_LOW_LEVEL_ALLOC_MISSING diff --git a/absl/synchronization/lifetime_test.cc b/absl/synchronization/lifetime_test.cc index 6aea60e1..a3e2701f 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() { diff --git a/absl/synchronization/mutex.cc b/absl/synchronization/mutex.cc index 32d9e3c2..b2aa7439 100644 --- a/absl/synchronization/mutex.cc +++ b/absl/synchronization/mutex.cc @@ -249,7 +249,6 @@ static const struct { { 0, "Signal on " }, { 0, "SignalAll on " }, }; - static absl::base_internal::SpinLock synch_event_mu( absl::base_internal::kLinkerInitialized); // protects synch_event diff --git a/absl/synchronization/mutex.h b/absl/synchronization/mutex.h index bad37c59..26ac7f61 100644 --- a/absl/synchronization/mutex.h +++ b/absl/synchronization/mutex.h @@ -875,6 +875,7 @@ class SCOPED_LOCKABLE ReleasableMutexLock { #ifdef ABSL_INTERNAL_USE_NONPROD_MUTEX #else + inline CondVar::CondVar() : cv_(0) {} #endif |