diff --git a/src/butil/thread_key.h b/src/butil/thread_key.h index e95fa2fa91..c150528b63 100644 --- a/src/butil/thread_key.h +++ b/src/butil/thread_key.h @@ -108,9 +108,9 @@ class ThreadLocal { T* get(); - T* operator->() const { return get(); } + T* operator->() { return get(); } - T& operator*() const { return *get(); } + T& operator*() { return *get(); } // Iterate through all thread local objects. // Callback, which must accept Args params and return void, diff --git a/test/thread_key_unittest.cpp b/test/thread_key_unittest.cpp index f254ce411d..5a95b8f0f9 100644 --- a/test/thread_key_unittest.cpp +++ b/test/thread_key_unittest.cpp @@ -46,6 +46,10 @@ struct ThreadKeyInfo { uint32_t seq; }; +struct ThreadKeyData { + int a{0}; +}; + TEST(ThreadLocalTest, sanity) { { ThreadKey key; @@ -65,13 +69,16 @@ TEST(ThreadLocalTest, sanity) { } for (int i = 0; i < 5; ++i) { - ThreadLocal tl; - ASSERT_TRUE(tl.get()!=NULL); - int* data = new int; + ThreadLocal tl; + ASSERT_TRUE(tl.get()); + ASSERT_EQ(tl->a, 0); + auto data = new ThreadKeyData; + data->a = 1; tl.reset(data); // tl owns data ASSERT_EQ(data, tl.get()); + ASSERT_EQ((*tl).a, 1); tl.reset(); // data has been deleted - ASSERT_TRUE(tl.get()!=NULL); + ASSERT_TRUE(tl.get()); } }