mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-12 04:42:36 -03:00
Pre-Vista leveldb::port::InitOnce implementation
This commit is contained in:
parent
21f2ae7563
commit
960797a0de
2 changed files with 21 additions and 8 deletions
|
@ -123,13 +123,8 @@ AtomicPointer::AtomicPointer(void* v) {
|
||||||
Release_Store(v);
|
Release_Store(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL CALLBACK InitHandleFunction (PINIT_ONCE InitOnce, PVOID func, PVOID *lpContext) {
|
|
||||||
((void (*)())func)();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitOnce(OnceType* once, void (*initializer)()) {
|
void InitOnce(OnceType* once, void (*initializer)()) {
|
||||||
InitOnceExecuteOnce((PINIT_ONCE)once, InitHandleFunction, initializer, NULL);
|
once->InitOnce(initializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* AtomicPointer::Acquire_Load() const {
|
void* AtomicPointer::Acquire_Load() const {
|
||||||
|
|
|
@ -93,8 +93,26 @@ class CondVar {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void* OnceType;
|
class OnceType {
|
||||||
#define LEVELDB_ONCE_INIT 0
|
public:
|
||||||
|
// OnceType() : init_(false) {}
|
||||||
|
OnceType(const OnceType &once) : init_(once.init_) {}
|
||||||
|
OnceType(bool f) : init_(f) {}
|
||||||
|
void InitOnce(void (*initializer)()) {
|
||||||
|
mutex_.Lock();
|
||||||
|
if (!init_) {
|
||||||
|
init_ = true;
|
||||||
|
initializer();
|
||||||
|
}
|
||||||
|
mutex_.Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool init_;
|
||||||
|
Mutex mutex_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LEVELDB_ONCE_INIT false
|
||||||
extern void InitOnce(port::OnceType*, void (*initializer)());
|
extern void InitOnce(port::OnceType*, void (*initializer)());
|
||||||
|
|
||||||
// Storage for a lock-free pointer
|
// Storage for a lock-free pointer
|
||||||
|
|
Loading…
Reference in a new issue