Commit 483ba5ea authored by Max Kellermann's avatar Max Kellermann

thread/GLibMutex: new Mutex implementation

Switch WIN32 to this implementation to be able to use condition variables, which is impossible with CriticalSection.
parent 18076ac9
......@@ -163,7 +163,7 @@ src_mpd_SOURCES = \
$(MIXER_API_SRC) \
src/thread/Mutex.hxx \
src/thread/PosixMutex.hxx \
src/thread/CriticalSection.hxx \
src/thread/GLibMutex.hxx \
src/glib_socket.h \
src/clock.c src/clock.h \
src/notify.c \
......
/*
* Copyright (C) 2009-2013 Max Kellermann <max@duempel.org>
* Copyright (C) 2013 Max Kellermann <max@duempel.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -27,36 +27,61 @@
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef MPD_THREAD_CRITICAL_SECTION_HXX
#define MPD_THREAD_CRITICAL_SECTION_HXX
#ifndef MPD_THREAD_GLIB_MUTEX_HXX
#define MPD_THREAD_GLIB_MUTEX_HXX
#include <windows.h>
#include <glib.h>
class CriticalSection {
CRITICAL_SECTION critical_section;
/**
* A wrapper for GMutex.
*/
class GLibMutex {
#if GLIB_CHECK_VERSION(2,32,0)
GMutex mutex;
#else
GMutex *mutex;
#endif
public:
CriticalSection() {
::InitializeCriticalSection(&critical_section);
GLibMutex() {
#if GLIB_CHECK_VERSION(2,32,0)
g_mutex_init(&mutex);
#else
mutex = g_mutex_new();
#endif
}
~CriticalSection() {
::DeleteCriticalSection(&critical_section);
~GLibMutex() {
#if GLIB_CHECK_VERSION(2,32,0)
g_mutex_clear(&mutex);
#else
g_mutex_free(mutex);
#endif
}
CriticalSection(const CriticalSection &other) = delete;
CriticalSection &operator=(const CriticalSection &other) = delete;
GLibMutex(const GLibMutex &other) = delete;
GLibMutex &operator=(const GLibMutex &other) = delete;
private:
GMutex *GetNative() {
#if GLIB_CHECK_VERSION(2,32,0)
return &mutex;
#else
return mutex;
#endif
}
public:
void lock() {
::EnterCriticalSection(&critical_section);
};
g_mutex_lock(GetNative());
}
bool try_lock() {
return ::TryEnterCriticalSection(&critical_section) != 0;
};
return g_mutex_trylock(GetNative());
}
void unlock() {
::LeaveCriticalSection(&critical_section);
g_mutex_lock(GetNative());
}
};
......
......@@ -24,8 +24,8 @@
/* mingw-w64 4.6.3 lacks a std::mutex implementation */
#include "CriticalSection.hxx"
typedef CriticalSection Mutex;
#include "GLibMutex.hxx"
typedef GLibMutex Mutex;
#else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment