116 lines
2.1 KiB
C++
116 lines
2.1 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1999 - 1999
|
||
|
//
|
||
|
// File: mmcmt.cpp
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
/*
|
||
|
mmcmt.cpp
|
||
|
|
||
|
Implementation of thread synchronization classes
|
||
|
*/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSyncObject
|
||
|
|
||
|
CSyncObject::CSyncObject() :
|
||
|
m_hObject( NULL )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
CSyncObject::~CSyncObject()
|
||
|
{
|
||
|
if( m_hObject != NULL )
|
||
|
{
|
||
|
::CloseHandle( m_hObject );
|
||
|
m_hObject = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CSyncObject::Lock( DWORD dwTimeout )
|
||
|
{
|
||
|
// this is a band-aid fix. Whis locking architecture is not working at all.
|
||
|
// Raid #374770 ( Windows Bugs ntraid9 4/23/2001 )
|
||
|
// fixes need to be made to:
|
||
|
// a) remove m_hObject member from this class
|
||
|
// b) remove CMutex - not used anywhere
|
||
|
// c) make Lock a pure virtual method and require everyone to override it.
|
||
|
// d) remove this locking from context menu - it is not needed there
|
||
|
|
||
|
if( m_hObject && ::WaitForSingleObject( m_hObject, dwTimeout) == WAIT_OBJECT_0 )
|
||
|
return TRUE;
|
||
|
else
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CMutex
|
||
|
|
||
|
CMutex::CMutex( BOOL bInitiallyOwn ) :
|
||
|
CSyncObject()
|
||
|
{
|
||
|
m_hObject = ::CreateMutex( NULL, bInitiallyOwn, NULL );
|
||
|
ASSERT( m_hObject );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
BOOL CMutex::Unlock()
|
||
|
{
|
||
|
return ::ReleaseMutex( m_hObject );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSingleLock
|
||
|
|
||
|
CSingleLock::CSingleLock( CSyncObject* pObject, BOOL bInitialLock )
|
||
|
{
|
||
|
ASSERT( pObject != NULL );
|
||
|
|
||
|
m_pObject = pObject;
|
||
|
m_hObject = *pObject;
|
||
|
m_bAcquired = FALSE;
|
||
|
|
||
|
if (bInitialLock)
|
||
|
Lock();
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CSingleLock::Lock( DWORD dwTimeOut )
|
||
|
{
|
||
|
ASSERT( m_pObject != NULL || m_hObject != NULL );
|
||
|
ASSERT( !m_bAcquired );
|
||
|
|
||
|
m_bAcquired = m_pObject->Lock( dwTimeOut );
|
||
|
return m_bAcquired;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CSingleLock::Unlock()
|
||
|
{
|
||
|
ASSERT( m_pObject != NULL );
|
||
|
if (m_bAcquired)
|
||
|
m_bAcquired = !m_pObject->Unlock();
|
||
|
|
||
|
// successfully unlocking means it isn't acquired
|
||
|
return !m_bAcquired;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|