diff options
author | Vitaly Novichkov <Wohlstand@users.noreply.github.com> | 2019-02-24 13:46:11 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-24 13:46:11 +0300 |
commit | cb465d27025c3fc594025fdefd1f83bf642b61f6 (patch) | |
tree | 1deab9d03d7189f1be6d18f3b53a743ea79896d0 /src/chips/common/mutex.hpp | |
parent | 48dabfa6f8efc25910eb73bfdcb024dd439dd2fd (diff) | |
parent | 432a19d45b1b285184a1000c6d528fcb0f360f7f (diff) | |
download | libADLMIDI-cb465d27025c3fc594025fdefd1f83bf642b61f6.tar.gz libADLMIDI-cb465d27025c3fc594025fdefd1f83bf642b61f6.tar.bz2 libADLMIDI-cb465d27025c3fc594025fdefd1f83bf642b61f6.zip |
Merge pull request #209 from jpcima/javaopl3
Javaopl3
Diffstat (limited to 'src/chips/common/mutex.hpp')
-rw-r--r-- | src/chips/common/mutex.hpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/chips/common/mutex.hpp b/src/chips/common/mutex.hpp new file mode 100644 index 0000000..53d7b72 --- /dev/null +++ b/src/chips/common/mutex.hpp @@ -0,0 +1,96 @@ +/* + * libADLMIDI is a free Software MIDI synthesizer library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma <bisqwit@iki.fi> + * ADLMIDI Library API: Copyright (c) 2015-2019 Vitaly Novichkov <admin@wohlnet.ru> + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#if !defined(_WIN32) +#include <pthread.h> +typedef pthread_mutex_t MutexNativeObject; +#else +#include <windows.h> +typedef CRITICAL_SECTION MutexNativeObject; +#endif + +class Mutex +{ +public: + Mutex(); + ~Mutex(); + void lock(); + void unlock(); +private: + MutexNativeObject m; + Mutex(const Mutex &); + Mutex &operator=(const Mutex &); +}; + +class MutexHolder +{ +public: + explicit MutexHolder(Mutex &m) : m(m) { m.lock(); } + ~MutexHolder() { m.unlock(); } +private: + Mutex &m; + MutexHolder(const MutexHolder &); + MutexHolder &operator=(const MutexHolder &); +}; + +#if !defined(_WIN32) +inline Mutex::Mutex() +{ + pthread_mutex_init(&m, NULL); +} + +inline Mutex::~Mutex() +{ + pthread_mutex_destroy(&m); +} + +inline void Mutex::lock() +{ + pthread_mutex_lock(&m); +} + +inline void Mutex::unlock() +{ + pthread_mutex_unlock(&m); +} +#else +inline Mutex::Mutex() +{ + InitializeCriticalSection(&m); +} + +inline Mutex::~Mutex() +{ + DeleteCriticalSection(&m); +} + +inline void Mutex::lock() +{ + EnterCriticalSection(&m); +} + +inline void Mutex::unlock() +{ + LeaveCriticalSection(&m); +} +#endif |