diff --git a/build_detect_platform b/build_detect_platform index f2e29bcca1a24..091923f03e7b3 100755 --- a/build_detect_platform +++ b/build_detect_platform @@ -133,11 +133,9 @@ case "$TARGET_OS" in ;; OS_WINDOWS_CROSSCOMPILE | NATIVE_WINDOWS) PLATFORM=OS_WINDOWS - COMMON_FLAGS="-fno-builtin-memcmp -D_REENTRANT -DOS_WINDOWS -DLEVELDB_PLATFORM_WINDOWS" - PLATFORM_SHARED_CFLAGS="" + COMMON_FLAGS="-fno-builtin-memcmp -D_REENTRANT -DOS_WINDOWS -DLEVELDB_PLATFORM_WINDOWS -DWINVER=0x0500 -D__USE_MINGW_ANSI_STDIO=1" PLATFORM_SOURCES="util/env_win.cc" - PLATFORM_CXXFLAGS="-std=c++0x" - PLATFORM_LIBS="-lshlwapi -ldbghelp" + PLATFORM_LIBS="-lshlwapi" PORT_FILE=port/port_win.cc CROSS_COMPILE=true ;; diff --git a/port/port_win.cc b/port/port_win.cc index 15dfde1f271f9..99c1d8e3460dd 100644 --- a/port/port_win.cc +++ b/port/port_win.cc @@ -37,7 +37,7 @@ namespace leveldb { namespace port { Mutex::Mutex() : - cs_(nullptr) { + cs_(NULL) { assert(!cs_); cs_ = static_cast(new CRITICAL_SECTION()); ::InitializeCriticalSection(static_cast(cs_)); @@ -48,7 +48,7 @@ Mutex::~Mutex() { assert(cs_); ::DeleteCriticalSection(static_cast(cs_)); delete static_cast(cs_); - cs_ = nullptr; + cs_ = NULL; assert(!cs_); } @@ -128,7 +128,7 @@ void InitOnce(OnceType* once, void (*initializer)()) { } void* AtomicPointer::Acquire_Load() const { - void * p = nullptr; + void * p = NULL; InterlockedExchangePointer(&p, rep_); return p; } diff --git a/port/port_win.h b/port/port_win.h index 849b01705fa19..45bf2f0ea749d 100644 --- a/port/port_win.h +++ b/port/port_win.h @@ -31,9 +31,11 @@ #ifndef STORAGE_LEVELDB_PORT_PORT_WIN_H_ #define STORAGE_LEVELDB_PORT_PORT_WIN_H_ +#ifdef _MSC_VER #define snprintf _snprintf #define close _close #define fread_unlocked _fread_nolock +#endif #include #include @@ -120,7 +122,7 @@ class AtomicPointer { private: void * rep_; public: - AtomicPointer() : rep_(nullptr) { } + AtomicPointer() : rep_(NULL) { } explicit AtomicPointer(void* v); void* Acquire_Load() const; diff --git a/util/env_win.cc b/util/env_win.cc index 384331aec5143..f1a76106247c2 100644 --- a/util/env_win.cc +++ b/util/env_win.cc @@ -20,9 +20,7 @@ #include #include #include -#include #include -#pragma comment(lib,"DbgHelp.lib") #ifdef max #undef max @@ -908,18 +906,34 @@ uint64_t Win32Env::NowMicros() return (uint64_t)(GetTickCount64()*1000); } -Status Win32Env::CreateDir( const std::string& dirname ) +static Status CreateDirInner( const std::string& dirname ) { Status sRet; + DWORD attr = ::GetFileAttributes(dirname.c_str()); + if (attr == INVALID_FILE_ATTRIBUTES) { // doesn't exist: + std::size_t slash = dirname.find_last_of("\\"); + if (slash != std::string::npos){ + sRet = CreateDirInner(dirname.substr(0, slash)); + if (!sRet.ok()) return sRet; + } + BOOL result = ::CreateDirectory(dirname.c_str(), NULL); + if (result == FALSE) { + sRet = Status::IOError(dirname, "Could not create directory."); + return sRet; + } + } + return sRet; +} + +Status Win32Env::CreateDir( const std::string& dirname ) +{ std::string path = dirname; if(path[path.length() - 1] != '\\'){ path += '\\'; } ModifyPath(path); - if(!::MakeSureDirectoryPathExists( path.c_str() ) ){ - sRet = Status::IOError(dirname, "Could not create directory."); - } - return sRet; + + return CreateDirInner(path); } Status Win32Env::DeleteDir( const std::string& dirname )