///+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1993 - 1998.
//
//  File:       Mutex.Hxx
//
//  Contents:   Mutex classes
//
//  Classes:    CNamedMutex, CNamedMutexLock
//
//  History:    29-March-94   t-joshh       Created.
//
//----------------------------------------------------------------------------

#pragma once

//+---------------------------------------------------------------------------
//
//  Class:      CNamedMutex
//
//  Purpose:    Provide mutual exclusion among several processes
//
//  History:    29-March-94   t-joshh       Created.
//
//  Notes:      When creating a mutex, a well-known name must be provided.
//
//----------------------------------------------------------------------------

class CNamedMutex
{
public :

    CNamedMutex() : _hNamedMutex( 0 ) {}

    void Init( WCHAR const * pwszNameMutex )
    {
        // Create with the process default security

        _hNamedMutex = CreateMutex( 0, FALSE, pwszNameMutex );

        if ( 0 == _hNamedMutex )
            THROW( CException() );
    }

   ~CNamedMutex ()
    {
        CloseHandle( _hNamedMutex );
    }

    ULONG  Request(DWORD dwMilliseconds = INFINITE)
    {
        return WaitForSingleObject ( _hNamedMutex, dwMilliseconds );
    }

    void   Release()
    {
        ReleaseMutex( _hNamedMutex );
    }

private :

    HANDLE _hNamedMutex;
};

//+---------------------------------------------------------------------------
//
//  Class:      CNamedMutexLock
//
//  Purpose:    Gets and releases the lock
//
//  History:    14-Jan-98   dlee       Created.
//
//----------------------------------------------------------------------------

class CNamedMutexLock
{
public:
    CNamedMutexLock( CNamedMutex & mutex ) :
        _mutex( mutex )
    {
        _mutex.Request();
    }

    ~CNamedMutexLock()
    {
        _mutex.Release();
    }

private:
    CNamedMutex & _mutex;
};