text: /*
   * 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
  
  