windows-nt/Source/XPSP1/NT/admin/activec/nodemgr/mmcmt.cpp
2020-09-26 16:20:57 +08:00

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;
}