15 #include "absl/base/internal/thread_identity.h"
20 #include "gtest/gtest.h"
21 #include "absl/base/attributes.h"
22 #include "absl/base/internal/spinlock.h"
23 #include "absl/base/macros.h"
24 #include "absl/base/thread_annotations.h"
25 #include "absl/synchronization/internal/per_thread_sem.h"
26 #include "absl/synchronization/mutex.h"
30 namespace base_internal {
37 static const void*
const kCheckNoIdentity =
reinterpret_cast<void*
>(1);
39 static void TestThreadIdentityCurrent(
const void* assert_no_identity) {
40 ThreadIdentity* identity;
45 if (assert_no_identity == kCheckNoIdentity) {
52 ThreadIdentity* identity_no_init;
59 EXPECT_EQ(identity, identity->per_thread_synch.thread_identity());
62 num_identities_reused++;
65 TEST(ThreadIdentityTest, BasicIdentityWorks) {
67 TestThreadIdentityCurrent(
nullptr);
70 TEST(ThreadIdentityTest, BasicIdentityWorksThreaded) {
77 static const int kNumLoops = 3;
80 std::vector<std::thread>
threads;
83 std::thread(TestThreadIdentityCurrent, kCheckNoIdentity));
97 TEST(ThreadIdentityTest, ReusedThreadIdentityMutexTest) {
103 static const int kNumLoops = 10;
105 static const int kNumMutexes = 3;
106 static const int kNumLockLoops = 5;
108 Mutex mutexes[kNumMutexes];
110 std::vector<std::thread>
threads;
113 for (
int l = 0;
l < kNumLockLoops; ++
l) {
114 for (
int m = 0;
m < kNumMutexes; ++
m) {