diff options
Diffstat (limited to 'absl/synchronization/mutex_test.cc')
-rw-r--r-- | absl/synchronization/mutex_test.cc | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/absl/synchronization/mutex_test.cc b/absl/synchronization/mutex_test.cc index 6c38c07c..35b43334 100644 --- a/absl/synchronization/mutex_test.cc +++ b/absl/synchronization/mutex_test.cc @@ -1709,6 +1709,33 @@ TEST(Mutex, Logging) { logged_cv.SignalAll(); } +TEST(Mutex, LoggingAddressReuse) { + // Repeatedly re-create a Mutex with debug logging at the same address. + alignas(absl::Mutex) char storage[sizeof(absl::Mutex)]; + auto invariant = + +[](void *alive) { EXPECT_TRUE(*static_cast<bool *>(alive)); }; + constexpr size_t kIters = 10; + bool alive[kIters] = {}; + for (size_t i = 0; i < kIters; ++i) { + absl::Mutex *mu = new (storage) absl::Mutex; + alive[i] = true; + mu->EnableDebugLog("Mutex"); + mu->EnableInvariantDebugging(invariant, &alive[i]); + mu->Lock(); + mu->Unlock(); + mu->~Mutex(); + alive[i] = false; + } +} + +TEST(Mutex, LoggingBankrupcy) { + // Test the case with too many live Mutexes with debug logging. + std::vector<absl::Mutex> mus(1 << 20); + for (auto &mu : mus) { + mu.EnableDebugLog("Mutex"); + } +} + // -------------------------------------------------------- // Generate the vector of thread counts for tests parameterized on thread count. |