diff options
author | Dan Albert <danalbert@google.com> | 2015-04-29 11:32:23 -0700 |
---|---|---|
committer | Dan Albert <danalbert@google.com> | 2015-04-29 18:01:53 -0700 |
commit | 5c19040b06b5bb61731e24ea6777c237dc23145d (patch) | |
tree | 4f1af4a4553d6aa695c4cd9eb974626b76b25f93 /base/logging.cpp | |
parent | 8076616c66057cbe52e4a9315ac48c00443aaf10 (diff) | |
download | core-5c19040b06b5bb61731e24ea6777c237dc23145d.tar.gz core-5c19040b06b5bb61731e24ea6777c237dc23145d.tar.bz2 core-5c19040b06b5bb61731e24ea6777c237dc23145d.zip |
Support base::logging on Windows.
libc++ doesn't support std::mutex and friends for Windows yet, so we
just use a compatibility wrapper for now.
Change-Id: I2413d4c089e7d0fb232444043c6b772153035dab
Diffstat (limited to 'base/logging.cpp')
-rw-r--r-- | base/logging.cpp | 90 |
1 files changed, 80 insertions, 10 deletions
diff --git a/base/logging.cpp b/base/logging.cpp index 0142b7078..83957b38d 100644 --- a/base/logging.cpp +++ b/base/logging.cpp @@ -27,12 +27,19 @@ #include <iostream> #include <limits> -#include <mutex> #include <sstream> #include <string> #include <utility> #include <vector> +#ifndef _WIN32 +#include <mutex> +#else +#define NOGDI // Suppress the evil ERROR macro. +#include <windows.h> +#endif + +#include "base/macros.h" #include "base/strings.h" #include "cutils/threads.h" @@ -45,10 +52,79 @@ #include <unistd.h> #endif +namespace { +#ifndef _WIN32 +using std::mutex; +using std::lock_guard; + +#if defined(__GLIBC__) +const char* getprogname() { + return program_invocation_short_name; +} +#endif + +#else +const char* getprogname() { + static bool first = true; + static char progname[MAX_PATH] = {}; + + if (first) { + // TODO(danalbert): This is a full path on Windows. Just get the basename. + DWORD nchars = GetModuleFileName(nullptr, progname, sizeof(progname)); + DCHECK_GT(nchars, 0U); + first = false; + } + + return progname; +} + +class mutex { + public: + mutex() { + semaphore_ = CreateSemaphore(nullptr, 1, 1, nullptr); + CHECK(semaphore_ != nullptr) << "Failed to create Mutex"; + } + ~mutex() { + CloseHandle(semaphore_); + } + + void lock() { + DWORD result = WaitForSingleObject(semaphore_, INFINITE); + CHECK_EQ(result, WAIT_OBJECT_0) << GetLastError(); + } + + void unlock() { + bool result = ReleaseSemaphore(semaphore_, 1, nullptr); + CHECK(result); + } + + private: + HANDLE semaphore_; +}; + +template <typename LockT> +class lock_guard { + public: + explicit lock_guard(LockT& lock) : lock_(lock) { + lock_.lock(); + } + + ~lock_guard() { + lock_.unlock(); + } + + private: + LockT& lock_; + + DISALLOW_COPY_AND_ASSIGN(lock_guard); +}; +#endif +} // namespace + namespace android { namespace base { -static std::mutex logging_lock; +static mutex logging_lock; #ifdef __ANDROID__ static LogFunction gLogger = LogdLogger(); @@ -60,12 +136,6 @@ static bool gInitialized = false; static LogSeverity gMinimumLogSeverity = INFO; static std::unique_ptr<std::string> gProgramInvocationName; -#if defined(__GLIBC__) -static const char* getprogname() { - return program_invocation_short_name; -} -#endif - static const char* ProgramInvocationName() { if (gProgramInvocationName == nullptr) { gProgramInvocationName.reset(new std::string(getprogname())); @@ -182,7 +252,7 @@ void InitLogging(char* argv[]) { } void SetLogger(LogFunction&& logger) { - std::lock_guard<std::mutex> lock(logging_lock); + lock_guard<mutex> lock(logging_lock); gLogger = std::move(logger); } @@ -287,7 +357,7 @@ std::ostream& LogMessage::stream() { void LogMessage::LogLine(const char* file, unsigned int line, LogId id, LogSeverity severity, const char* message) { const char* tag = ProgramInvocationName(); - std::lock_guard<std::mutex> lock(logging_lock); + lock_guard<mutex> lock(logging_lock); gLogger(id, severity, tag, file, line, message); } |