summaryrefslogtreecommitdiff
path: root/common/JackMutex.h
diff options
context:
space:
mode:
authorsletz <sletz@0c269be4-1314-0410-8aa9-9f06e86f4224>2007-10-25 09:29:48 +0000
committersletz <sletz@0c269be4-1314-0410-8aa9-9f06e86f4224>2007-10-25 09:29:48 +0000
commit82316a5483ca27044c890ccac2d999bc1509e5c0 (patch)
tree7a62a3da53112b96881589f34e6f7c7b5fb67695 /common/JackMutex.h
parent17a9ec8e3616ed2409eebfe1da7681ebe26a99ca (diff)
downloadjack2-82316a5483ca27044c890ccac2d999bc1509e5c0.tar.gz
Merge of Dmitry Baikov MIDI branch.
git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1647 0c269be4-1314-0410-8aa9-9f06e86f4224
Diffstat (limited to 'common/JackMutex.h')
-rw-r--r--common/JackMutex.h151
1 files changed, 151 insertions, 0 deletions
diff --git a/common/JackMutex.h b/common/JackMutex.h
new file mode 100644
index 00000000..5f0c9ec0
--- /dev/null
+++ b/common/JackMutex.h
@@ -0,0 +1,151 @@
+ /*
+
+ Copyright (C) 2006 Grame
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Grame Research Laboratory, 9 rue du Garet, 69001 Lyon - France
+ grame@grame.fr
+
+*/
+
+#ifndef __JackMutex__
+#define __JackMutex__
+
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <pthread.h>
+#endif
+
+#include<assert.h>
+
+namespace Jack
+{
+
+class JackMutex
+{
+
+ private:
+
+ #ifdef WIN32
+ HANDLE fMutex;
+ #else
+ pthread_mutex_t fMutex;
+ #endif
+
+ public:
+
+ #ifdef WIN32
+
+ JackMutex()
+ {
+ fMutex = CreateMutex(0, FALSE, 0);
+ }
+ virtual ~JackMutex()
+ {
+ CloseHandle(fMutex);
+ }
+
+ void Lock()
+ {
+ DWORD dwWaitResult = WaitForSingleObject(fMutex, INFINITE);
+ }
+
+ void Unlock()
+ {
+ ReleaseMutex(fMutex);
+ }
+
+ #else
+
+ JackMutex()
+ {
+ // Use recursive mutex
+ pthread_mutexattr_t mutex_attr;
+ assert(pthread_mutexattr_init(&mutex_attr) == 0);
+ assert(pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE) == 0);
+ assert(pthread_mutex_init(&fMutex, &mutex_attr) == 0);
+ }
+ virtual ~JackMutex()
+ {
+ pthread_mutex_destroy(&fMutex);
+ }
+
+ void Lock()
+ {
+ pthread_mutex_lock(&fMutex);
+ }
+
+ void Unlock()
+ {
+ pthread_mutex_unlock(&fMutex);
+ }
+
+ #endif
+};
+
+class JackLockAble
+{
+
+ private:
+
+ JackMutex fMutex;
+
+ public:
+
+ JackLockAble() {}
+ virtual ~JackLockAble() {}
+
+ void Lock()
+ {
+ fMutex.Lock();
+ }
+
+ void Unlock()
+ {
+ fMutex.Unlock();
+ }
+
+};
+
+class JackLock
+{
+ private:
+
+ JackLockAble* fObj;
+
+ public:
+
+ JackLock(JackLockAble* obj):fObj(obj)
+ {
+ fObj->Lock();
+ }
+
+ JackLock(const JackLockAble* obj):fObj((JackLockAble*)obj)
+ {
+ fObj->Lock();
+ }
+
+ virtual ~JackLock()
+ {
+ fObj->Unlock();
+ }
+};
+
+
+} // namespace
+
+#endif