diff options
-rw-r--r-- | absl/base/config.h | 24 | ||||
-rw-r--r-- | absl/base/internal/malloc_hook.cc | 1 | ||||
-rw-r--r-- | absl/base/internal/spinlock.cc | 5 | ||||
-rw-r--r-- | absl/base/internal/spinlock.h | 6 | ||||
-rw-r--r-- | absl/base/internal/sysinfo.cc | 2 | ||||
-rw-r--r-- | absl/base/internal/thread_identity_test.cc | 1 | ||||
-rw-r--r-- | absl/base/spinlock_test_common.cc | 5 | ||||
-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 | ||||
-rw-r--r-- | absl/time/clock.cc | 2 |
13 files changed, 70 insertions, 21 deletions
diff --git a/absl/base/config.h b/absl/base/config.h index 5802b653..3f3b8b3a 100644 --- a/absl/base/config.h +++ b/absl/base/config.h @@ -181,21 +181,21 @@ // __SIZEOF_INT128__ but not all versions actually support __int128. #ifdef ABSL_HAVE_INTRINSIC_INT128 #error ABSL_HAVE_INTRINSIC_INT128 cannot be directly set -#elif (defined(__clang__) && defined(__SIZEOF_INT128__) && \ - !defined(__aarch64__)) || \ - (defined(__CUDACC__) && defined(__SIZEOF_INT128__) && \ - __CUDACC_VER_MAJOR__ >= 9) || \ - (!defined(__clang__) && !defined(__CUDACC__) && defined(__GNUC__) && \ - defined(__SIZEOF_INT128__)) +#elif defined(__SIZEOF_INT128__) +#if (defined(__clang__) && !defined(__aarch64__)) || \ + (defined(__CUDACC__) && __CUDACC_VER_MAJOR__ >= 9) || \ + (!defined(__clang__) && !defined(__CUDACC__) && defined(__GNUC__)) #define ABSL_HAVE_INTRINSIC_INT128 1 +#elif defined(__CUDACC__) // __CUDACC_VER__ is a full version number before CUDA 9, and is defined to a -// std::string explaining that it has been removed starting with CUDA 9. We can't -// compare both variants in a single boolean expression because there is no -// short-circuiting in the preprocessor. -#elif defined(__CUDACC__) && defined(__SIZEOF_INT128__) && \ - __CUDACC_VER__ >= 7000 +// std::string explaining that it has been removed starting with CUDA 9. We use +// nested #ifs because there is no short-circuiting in the preprocessor. +// NOTE: `__CUDACC__` could be undefined while `__CUDACC_VER__` is defined. +#if __CUDACC_VER__ >= 70000 #define ABSL_HAVE_INTRINSIC_INT128 1 -#endif +#endif // __CUDACC_VER__ >= 70000 +#endif // defined(__CUDACC__) +#endif // ABSL_HAVE_INTRINSIC_INT128 // ABSL_HAVE_EXCEPTIONS // diff --git a/absl/base/internal/malloc_hook.cc b/absl/base/internal/malloc_hook.cc index 7165d4cb..52531c68 100644 --- a/absl/base/internal/malloc_hook.cc +++ b/absl/base/internal/malloc_hook.cc @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "absl/base/attributes.h" #include "absl/base/config.h" #if ABSL_HAVE_MMAP diff --git a/absl/base/internal/spinlock.cc b/absl/base/internal/spinlock.cc index 3ac1f4dc..28a2059f 100644 --- a/absl/base/internal/spinlock.cc +++ b/absl/base/internal/spinlock.cc @@ -83,11 +83,6 @@ void RegisterSpinLockProfiler(void (*fn)(const void *contendedlock, submit_profile_data.Store(fn); } -static inline bool IsCooperative( - base_internal::SchedulingMode scheduling_mode) { - return scheduling_mode == base_internal::SCHEDULE_COOPERATIVE_AND_KERNEL; -} - // Uncommon constructors. SpinLock::SpinLock(base_internal::SchedulingMode mode) : lockword_(IsCooperative(mode) ? kSpinLockCooperative : 0) { diff --git a/absl/base/internal/spinlock.h b/absl/base/internal/spinlock.h index f486f68a..a9037e3e 100644 --- a/absl/base/internal/spinlock.h +++ b/absl/base/internal/spinlock.h @@ -151,6 +151,12 @@ class LOCKABLE SpinLock { enum { kWaitTimeMask = // Includes kSpinLockSleeper. ~(kSpinLockHeld | kSpinLockCooperative | kSpinLockDisabledScheduling) }; + // Returns true if the provided scheduling mode is cooperative. + static constexpr bool IsCooperative( + base_internal::SchedulingMode scheduling_mode) { + return scheduling_mode == base_internal::SCHEDULE_COOPERATIVE_AND_KERNEL; + } + uint32_t TryLockInternal(uint32_t lock_value, uint32_t wait_cycles); void InitLinkerInitializedAndCooperative(); void SlowLock() ABSL_ATTRIBUTE_COLD; diff --git a/absl/base/internal/sysinfo.cc b/absl/base/internal/sysinfo.cc index 884c3126..dca7d8fd 100644 --- a/absl/base/internal/sysinfo.cc +++ b/absl/base/internal/sysinfo.cc @@ -14,6 +14,8 @@ #include "absl/base/internal/sysinfo.h" +#include "absl/base/attributes.h" + #ifdef _WIN32 #include <shlwapi.h> #include <windows.h> diff --git a/absl/base/internal/thread_identity_test.cc b/absl/base/internal/thread_identity_test.cc index 7695a091..ecb8af68 100644 --- a/absl/base/internal/thread_identity_test.cc +++ b/absl/base/internal/thread_identity_test.cc @@ -18,6 +18,7 @@ #include <vector> #include "gtest/gtest.h" +#include "absl/base/attributes.h" #include "absl/base/internal/spinlock.h" #include "absl/base/macros.h" #include "absl/synchronization/internal/per_thread_sem.h" diff --git a/absl/base/spinlock_test_common.cc b/absl/base/spinlock_test_common.cc index 6918603c..1b508848 100644 --- a/absl/base/spinlock_test_common.cc +++ b/absl/base/spinlock_test_common.cc @@ -23,6 +23,7 @@ #include <vector> #include "gtest/gtest.h" +#include "absl/base/attributes.h" #include "absl/base/internal/low_level_scheduling.h" #include "absl/base/internal/scheduling_mode.h" #include "absl/base/internal/spinlock.h" @@ -53,7 +54,6 @@ namespace { static constexpr int kArrayLength = 10; static uint32_t values[kArrayLength]; - static SpinLock static_spinlock(base_internal::kLinkerInitialized); static SpinLock static_cooperative_spinlock( base_internal::kLinkerInitialized, @@ -61,6 +61,7 @@ static SpinLock static_cooperative_spinlock( static SpinLock static_noncooperative_spinlock( base_internal::kLinkerInitialized, base_internal::SCHEDULE_KERNEL_ONLY); + // Simple integer hash function based on the public domain lookup2 hash. // http://burtleburtle.net/bob/c/lookup2.c static uint32_t Hash32(uint32_t a, uint32_t c) { @@ -187,11 +188,9 @@ TEST(SpinLock, WaitCyclesEncoding) { SpinLockTest::DecodeWaitCycles(before_max_value); EXPECT_GT(expected_max_value_decoded, before_max_value_decoded); } - TEST(SpinLockWithThreads, StaticSpinLock) { ThreadedTest(&static_spinlock); } - TEST(SpinLockWithThreads, StackSpinLock) { SpinLock spinlock; ThreadedTest(&spinlock); 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 diff --git a/absl/time/clock.cc b/absl/time/clock.cc index 9f2e0781..59709dea 100644 --- a/absl/time/clock.cc +++ b/absl/time/clock.cc @@ -1,5 +1,7 @@ #include "absl/time/clock.h" +#include "absl/base/attributes.h" + #ifdef _WIN32 #include <windows.h> #endif |