text: /**************************************************************************
  
      A/V Stream Camera Sample
  
      Copyright (c) 2013, Microsoft Corporation.
  
      File:
  
          Mutex.h
  
      Abstract:
  
          This file provides the declaration of KMutex and KScopedMutex.
          
          KMutex provides a wrapper around a KMUTEX object.  KScopedMutex is
          provided as a helper class to ensure all exits release the lock.
  
      History:
  
          created 7/16/2013
  
  **************************************************************************/
  #pragma once
  
  //
  //  Specialized class for KMUTEX
  //
  class KMutex : CNonCopyable
  {
      KMUTEX  m_Lock;
  
  public:
      KMutex()
      {
          KeInitializeMutex( &m_Lock, 0 );
      }
  
      virtual ~KMutex();
  
      //
      //  Preferred lock method.
      //
      _IRQL_requires_min_(PASSIVE_LEVEL)
      _When_((Timeout==NULL || Timeout->QuadPart!=0), _IRQL_requires_max_(APC_LEVEL))
      _When_((Timeout!=NULL &&Timeout->QuadPart==0), _IRQL_requires_max_(DISPATCH_LEVEL))
      NTSTATUS
      Lock(
          _In_opt_ PLARGE_INTEGER Timeout=nullptr
      );
  
      //
      //  Preferred unlock method.
      //
      _IRQL_requires_max_(DISPATCH_LEVEL)
      void
      Unlock();
  };
  
  //
  //  Use this class to hold a spinlock through a particular scope
  //
  class KScopedMutex : CNonCopyable
  {
      KMutex  &m_Lock;
  
  public:
      _IRQL_requires_min_(PASSIVE_LEVEL)
      _IRQL_requires_max_(APC_LEVEL)
      KScopedMutex( KMutex &lock )
          : m_Lock(lock)
      {
          m_Lock.Lock();
      }
  
      _IRQL_requires_max_(DISPATCH_LEVEL)
      ~KScopedMutex(void)
      {
          m_Lock.Unlock();
      }
  };
  
  