thread/GLibMutex: new Mutex implementation
Switch WIN32 to this implementation to be able to use condition variables, which is impossible with CriticalSection.
This commit is contained in:
parent
18076ac9b7
commit
483ba5ea1c
@ -163,7 +163,7 @@ src_mpd_SOURCES = \
|
|||||||
$(MIXER_API_SRC) \
|
$(MIXER_API_SRC) \
|
||||||
src/thread/Mutex.hxx \
|
src/thread/Mutex.hxx \
|
||||||
src/thread/PosixMutex.hxx \
|
src/thread/PosixMutex.hxx \
|
||||||
src/thread/CriticalSection.hxx \
|
src/thread/GLibMutex.hxx \
|
||||||
src/glib_socket.h \
|
src/glib_socket.h \
|
||||||
src/clock.c src/clock.h \
|
src/clock.c src/clock.h \
|
||||||
src/notify.c \
|
src/notify.c \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@ -27,36 +27,61 @@
|
|||||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MPD_THREAD_CRITICAL_SECTION_HXX
|
#ifndef MPD_THREAD_GLIB_MUTEX_HXX
|
||||||
#define MPD_THREAD_CRITICAL_SECTION_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:
|
public:
|
||||||
CriticalSection() {
|
GLibMutex() {
|
||||||
::InitializeCriticalSection(&critical_section);
|
#if GLIB_CHECK_VERSION(2,32,0)
|
||||||
|
g_mutex_init(&mutex);
|
||||||
|
#else
|
||||||
|
mutex = g_mutex_new();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
~CriticalSection() {
|
~GLibMutex() {
|
||||||
::DeleteCriticalSection(&critical_section);
|
#if GLIB_CHECK_VERSION(2,32,0)
|
||||||
|
g_mutex_clear(&mutex);
|
||||||
|
#else
|
||||||
|
g_mutex_free(mutex);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CriticalSection(const CriticalSection &other) = delete;
|
GLibMutex(const GLibMutex &other) = delete;
|
||||||
CriticalSection &operator=(const CriticalSection &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() {
|
void lock() {
|
||||||
::EnterCriticalSection(&critical_section);
|
g_mutex_lock(GetNative());
|
||||||
};
|
}
|
||||||
|
|
||||||
bool try_lock() {
|
bool try_lock() {
|
||||||
return ::TryEnterCriticalSection(&critical_section) != 0;
|
return g_mutex_trylock(GetNative());
|
||||||
};
|
}
|
||||||
|
|
||||||
void unlock() {
|
void unlock() {
|
||||||
::LeaveCriticalSection(&critical_section);
|
g_mutex_lock(GetNative());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -24,8 +24,8 @@
|
|||||||
|
|
||||||
/* mingw-w64 4.6.3 lacks a std::mutex implementation */
|
/* mingw-w64 4.6.3 lacks a std::mutex implementation */
|
||||||
|
|
||||||
#include "CriticalSection.hxx"
|
#include "GLibMutex.hxx"
|
||||||
typedef CriticalSection Mutex;
|
typedef GLibMutex Mutex;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user