转:http://gmd20.blog.163.com/blog/static/1684392320131733835919/
// Copyright (c) 2011 The LevelDB Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. #ifndef STORAGE_LEVELDB_PORT_PORT_H_ #define STORAGE_LEVELDB_PORT_PORT_H_ #include <string.h> // Include the appropriate platform specific file below. If you are // porting to a new platform, see "port_example.h" for documentation // of what the new port_<platform>.h file must provide. #if defined(LEVELDB_PLATFORM_POSIX) # include "port/port_posix.h" #elif defined(LEVELDB_PLATFORM_CHROMIUM) # include "port/port_chromium.h" #elif defined(LEVELDB_PLATFORM_WINDOWS) # include "port/port_win.h" #endif #endif // STORAGE_LEVELDB_PORT_PORT_H_
// Thread-safe initialization. // Used as follows: // static port::OnceType init_control = LEVELDB_ONCE_INIT; // static void Initializer() { ... do something ...; } // ... // port::InitOnce(&init_control, &Initializer); typedef long OnceType; #define LEVELDB_ONCE_INIT 0 extern void InitOnce(port::OnceType*, void (*initializer)());
//----------------cpp-----------------------------------
void InitOnce(OnceType* once, void (*initializer)()) { if (InterlockedCompareExchange (once, 1,0) == 0 ) { initializer(); } }
#ifdef WIN32 #include <io.h> #include <process.h> #else #include <unistd.h> #endif