Skip to content

Commit 547bb6a

Browse files
author
Lei Jin
committed
simplify ThreadLocalPtr a little bit
Summary: make singleton a static member instead of dynamic object. This should also avoid the race on unique_ptr Test Plan: make all check Reviewers: igor, haobo, sdong Reviewed By: igor CC: leveldb Differential Revision: https://reviews.facebook.net/D18177
1 parent 86a0133 commit 547bb6a

File tree

3 files changed

+15
-24
lines changed

3 files changed

+15
-24
lines changed

util/thread_local.cc

+11-17
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,14 @@
1414

1515
namespace rocksdb {
1616

17-
std::unique_ptr<ThreadLocalPtr::StaticMeta> ThreadLocalPtr::StaticMeta::inst_;
1817
port::Mutex ThreadLocalPtr::StaticMeta::mutex_;
1918
#if !defined(OS_MACOSX)
2019
__thread ThreadLocalPtr::ThreadData* ThreadLocalPtr::StaticMeta::tls_ = nullptr;
2120
#endif
2221

23-
ThreadLocalPtr::StaticMeta* ThreadLocalPtr::StaticMeta::Instance() {
24-
if (UNLIKELY(inst_ == nullptr)) {
25-
MutexLock l(&mutex_);
26-
if (inst_ == nullptr) {
27-
inst_.reset(new StaticMeta());
28-
}
29-
}
30-
return inst_.get();
22+
ThreadLocalPtr::StaticMeta* ThreadLocalPtr::Instance() {
23+
static ThreadLocalPtr::StaticMeta inst;
24+
return &inst;
3125
}
3226

3327
void ThreadLocalPtr::StaticMeta::OnThreadExit(void* ptr) {
@@ -216,34 +210,34 @@ void ThreadLocalPtr::StaticMeta::ReclaimId(uint32_t id) {
216210
}
217211

218212
ThreadLocalPtr::ThreadLocalPtr(UnrefHandler handler)
219-
: id_(StaticMeta::Instance()->GetId()) {
213+
: id_(Instance()->GetId()) {
220214
if (handler != nullptr) {
221-
StaticMeta::Instance()->SetHandler(id_, handler);
215+
Instance()->SetHandler(id_, handler);
222216
}
223217
}
224218

225219
ThreadLocalPtr::~ThreadLocalPtr() {
226-
StaticMeta::Instance()->ReclaimId(id_);
220+
Instance()->ReclaimId(id_);
227221
}
228222

229223
void* ThreadLocalPtr::Get() const {
230-
return StaticMeta::Instance()->Get(id_);
224+
return Instance()->Get(id_);
231225
}
232226

233227
void ThreadLocalPtr::Reset(void* ptr) {
234-
StaticMeta::Instance()->Reset(id_, ptr);
228+
Instance()->Reset(id_, ptr);
235229
}
236230

237231
void* ThreadLocalPtr::Swap(void* ptr) {
238-
return StaticMeta::Instance()->Swap(id_, ptr);
232+
return Instance()->Swap(id_, ptr);
239233
}
240234

241235
bool ThreadLocalPtr::CompareAndSwap(void* ptr, void*& expected) {
242-
return StaticMeta::Instance()->CompareAndSwap(id_, ptr, expected);
236+
return Instance()->CompareAndSwap(id_, ptr, expected);
243237
}
244238

245239
void ThreadLocalPtr::Scrape(autovector<void*>* ptrs, void* const replacement) {
246-
StaticMeta::Instance()->Scrape(id_, ptrs, replacement);
240+
Instance()->Scrape(id_, ptrs, replacement);
247241
}
248242

249243
} // namespace rocksdb

util/thread_local.h

+3-6
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class ThreadLocalPtr {
8989

9090
class StaticMeta {
9191
public:
92-
static StaticMeta* Instance();
92+
StaticMeta();
9393

9494
// Return the next available Id
9595
uint32_t GetId();
@@ -117,8 +117,6 @@ class ThreadLocalPtr {
117117
void SetHandler(uint32_t id, UnrefHandler handler);
118118

119119
private:
120-
StaticMeta();
121-
122120
// Get UnrefHandler for id with acquiring mutex
123121
// REQUIRES: mutex locked
124122
UnrefHandler GetHandler(uint32_t id);
@@ -136,9 +134,6 @@ class ThreadLocalPtr {
136134

137135
static ThreadData* GetThreadLocal();
138136

139-
// Singleton instance
140-
static std::unique_ptr<StaticMeta> inst_;
141-
142137
uint32_t next_instance_id_;
143138
// Used to recycle Ids in case ThreadLocalPtr is instantiated and destroyed
144139
// frequently. This also prevents it from blowing up the vector space.
@@ -163,6 +158,8 @@ class ThreadLocalPtr {
163158
pthread_key_t pthread_key_;
164159
};
165160

161+
static StaticMeta* Instance();
162+
166163
const uint32_t id_;
167164
};
168165

util/thread_local_test.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ struct Params {
4949

5050
class IDChecker : public ThreadLocalPtr {
5151
public:
52-
static uint32_t PeekId() { return StaticMeta::Instance()->PeekId(); }
52+
static uint32_t PeekId() { return Instance()->PeekId(); }
5353
};
5454

5555
} // anonymous namespace

0 commit comments

Comments
 (0)