Browse Source

Pre-Vista leveldb::port::InitOnce implementation

0.8
Pieter Wuille 12 years ago committed by Gavin Andresen
parent
commit
960797a0de
  1. 7
      src/leveldb/port/port_win.cc
  2. 22
      src/leveldb/port/port_win.h

7
src/leveldb/port/port_win.cc

@ -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 {

22
src/leveldb/port/port_win.h

@ -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…
Cancel
Save