Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+-------------------------------------------------------------------------
//
// 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; }
|