1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /*
- * mptMutex.h
- * ----------
- * Purpose: Partially implement c++ mutexes as far as openmpt needs them. Can eventually go away when we only support c++11 compilers some time.
- * Notes : (currently none)
- * Authors: OpenMPT Devs
- * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
- */
- #pragma once
- #include "openmpt/all/BuildSettings.hpp"
- #include "mpt/mutex/mutex.hpp"
- OPENMPT_NAMESPACE_BEGIN
- namespace mpt {
- class recursive_mutex_with_lock_count {
- private:
- mpt::recursive_mutex mutex;
- #if MPT_COMPILER_MSVC
- _Guarded_by_(mutex)
- #endif // MPT_COMPILER_MSVC
- long lockCount;
- public:
- recursive_mutex_with_lock_count()
- : lockCount(0)
- {
- return;
- }
- ~recursive_mutex_with_lock_count()
- {
- return;
- }
- #if MPT_COMPILER_MSVC
- _Acquires_lock_(mutex)
- #endif // MPT_COMPILER_MSVC
- void lock()
- {
- mutex.lock();
- lockCount++;
- }
- #if MPT_COMPILER_MSVC
- _Requires_lock_held_(mutex) _Releases_lock_(mutex)
- #endif // MPT_COMPILER_MSVC
- void unlock()
- {
- lockCount--;
- mutex.unlock();
- }
- public:
- bool IsLockedByCurrentThread() // DEBUGGING only
- {
- bool islocked = false;
- if(mutex.try_lock())
- {
- islocked = (lockCount > 0);
- mutex.unlock();
- }
- return islocked;
- }
- };
- } // namespace mpt
- OPENMPT_NAMESPACE_END
|