mirror of https://github.com/tongzx/nt5src
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.
322 lines
5.7 KiB
322 lines
5.7 KiB
// This is a part of the Active Template Library.
|
|
// Copyright (C) 1996-2001 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// This source code is only intended as a supplement to the
|
|
// Active Template Library Reference and related
|
|
// electronic documentation provided with the library.
|
|
// See these sources for detailed information regarding the
|
|
// Active Template Library product.
|
|
|
|
#ifndef __ATLSYNC_INL__
|
|
#define __ATLSYNC_INL__
|
|
|
|
#pragma once
|
|
|
|
#ifndef __ATLSYNC_H__
|
|
#error atlsync.inl requires atlsync.h to be included first
|
|
#endif
|
|
|
|
namespace ATL
|
|
{
|
|
|
|
inline CCriticalSection::CCriticalSection()
|
|
{
|
|
__try
|
|
{
|
|
::InitializeCriticalSection( this );
|
|
}
|
|
__except( EXCEPTION_EXECUTE_HANDLER )
|
|
{
|
|
AtlThrow( E_OUTOFMEMORY );
|
|
}
|
|
}
|
|
|
|
#if (_WIN32_WINNT >= 0x0403)
|
|
inline CCriticalSection::CCriticalSection( ULONG nSpinCount )
|
|
{
|
|
__try
|
|
{
|
|
::InitializeCriticalSectionAndSpinCount( this, nSpinCount );
|
|
}
|
|
__except( EXCEPTION_EXECUTE_HANDLER )
|
|
{
|
|
AtlThrow( E_OUTOFMEMORY );
|
|
}
|
|
}
|
|
#endif
|
|
|
|
inline CCriticalSection::~CCriticalSection()
|
|
{
|
|
::DeleteCriticalSection( this );
|
|
}
|
|
|
|
inline void CCriticalSection::Enter()
|
|
{
|
|
__try
|
|
{
|
|
::EnterCriticalSection( this );
|
|
}
|
|
__except( EXCEPTION_EXECUTE_HANDLER )
|
|
{
|
|
AtlThrow( E_OUTOFMEMORY );
|
|
}
|
|
}
|
|
|
|
inline void CCriticalSection::Leave()
|
|
{
|
|
::LeaveCriticalSection( this );
|
|
}
|
|
|
|
#if (_WIN32_WINNT >= 0x0403)
|
|
inline ULONG CCriticalSection::SetSpinCount( ULONG nSpinCount )
|
|
{
|
|
return( ::SetCriticalSectionSpinCount( this, nSpinCount ) );
|
|
}
|
|
#endif
|
|
|
|
#if(_WIN32_WINNT >= 0x0400)
|
|
inline BOOL CCriticalSection::TryEnter()
|
|
{
|
|
return( ::TryEnterCriticalSection( this ) );
|
|
}
|
|
#endif
|
|
|
|
inline CEvent::CEvent()
|
|
{
|
|
}
|
|
|
|
inline CEvent::CEvent( CEvent& hEvent ) :
|
|
CHandle( hEvent )
|
|
{
|
|
}
|
|
|
|
inline CEvent::CEvent( BOOL bManualReset, BOOL bInitialState )
|
|
{
|
|
BOOL bSuccess;
|
|
|
|
bSuccess = Create( NULL, bManualReset, bInitialState, NULL );
|
|
if( !bSuccess )
|
|
{
|
|
AtlThrowLastWin32();
|
|
}
|
|
}
|
|
|
|
inline CEvent::CEvent( LPSECURITY_ATTRIBUTES pAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR pszName )
|
|
{
|
|
BOOL bSuccess;
|
|
|
|
bSuccess = Create( pAttributes, bManualReset, bInitialState, pszName );
|
|
if( !bSuccess )
|
|
{
|
|
AtlThrowLastWin32();
|
|
}
|
|
}
|
|
|
|
|
|
inline CEvent::CEvent( HANDLE h ) :
|
|
CHandle( h )
|
|
{
|
|
}
|
|
|
|
inline BOOL CEvent::Create( LPSECURITY_ATTRIBUTES pSecurity, BOOL bManualReset, BOOL bInitialState, LPCTSTR pszName )
|
|
{
|
|
ATLASSERT( m_h == NULL );
|
|
|
|
m_h = ::CreateEvent( pSecurity, bManualReset, bInitialState, pszName );
|
|
|
|
return( m_h != NULL );
|
|
}
|
|
|
|
inline BOOL CEvent::Open( DWORD dwAccess, BOOL bInheritHandle, LPCTSTR pszName )
|
|
{
|
|
ATLASSERT( m_h == NULL );
|
|
|
|
m_h = ::OpenEvent( dwAccess, bInheritHandle, pszName );
|
|
return( m_h != NULL );
|
|
}
|
|
|
|
inline BOOL CEvent::Pulse()
|
|
{
|
|
ATLASSERT( m_h != NULL );
|
|
|
|
return( ::PulseEvent( m_h ) );
|
|
}
|
|
|
|
inline BOOL CEvent::Reset()
|
|
{
|
|
ATLASSERT( m_h != NULL );
|
|
|
|
return( ::ResetEvent( m_h ) );
|
|
}
|
|
|
|
inline BOOL CEvent::Set()
|
|
{
|
|
ATLASSERT( m_h != NULL );
|
|
|
|
return( ::SetEvent( m_h ) );
|
|
}
|
|
|
|
|
|
inline CMutex::CMutex()
|
|
{
|
|
}
|
|
|
|
inline CMutex::CMutex( CMutex& hMutex ) :
|
|
CHandle( hMutex )
|
|
{
|
|
}
|
|
|
|
inline CMutex::CMutex( BOOL bInitialOwner )
|
|
{
|
|
BOOL bSuccess;
|
|
|
|
bSuccess = Create( NULL, bInitialOwner, NULL );
|
|
if( !bSuccess )
|
|
{
|
|
AtlThrowLastWin32();
|
|
}
|
|
}
|
|
|
|
inline CMutex::CMutex( LPSECURITY_ATTRIBUTES pSecurity, BOOL bInitialOwner, LPCTSTR pszName )
|
|
{
|
|
BOOL bSuccess;
|
|
|
|
bSuccess = Create( pSecurity, bInitialOwner, pszName );
|
|
if( !bSuccess )
|
|
{
|
|
AtlThrowLastWin32();
|
|
}
|
|
}
|
|
|
|
inline CMutex::CMutex( HANDLE h ) :
|
|
CHandle( h )
|
|
{
|
|
}
|
|
|
|
inline BOOL CMutex::Create( LPSECURITY_ATTRIBUTES pSecurity, BOOL bInitialOwner, LPCTSTR pszName )
|
|
{
|
|
ATLASSERT( m_h == NULL );
|
|
|
|
m_h = ::CreateMutex( pSecurity, bInitialOwner, pszName );
|
|
return( m_h != NULL );
|
|
}
|
|
|
|
inline BOOL CMutex::Open( DWORD dwAccess, BOOL bInheritHandle, LPCTSTR pszName )
|
|
{
|
|
ATLASSERT( m_h == NULL );
|
|
|
|
m_h = ::OpenMutex( dwAccess, bInheritHandle, pszName );
|
|
return( m_h != NULL );
|
|
}
|
|
|
|
inline BOOL CMutex::Release()
|
|
{
|
|
ATLASSERT( m_h != NULL );
|
|
|
|
return( ::ReleaseMutex( m_h ) );
|
|
}
|
|
|
|
|
|
inline CSemaphore::CSemaphore()
|
|
{
|
|
}
|
|
|
|
inline CSemaphore::CSemaphore( CSemaphore& hSemaphore ) :
|
|
CHandle( hSemaphore )
|
|
{
|
|
}
|
|
|
|
inline CSemaphore::CSemaphore( LONG nInitialCount, LONG nMaxCount )
|
|
{
|
|
BOOL bSuccess;
|
|
|
|
bSuccess = Create( NULL, nInitialCount, nMaxCount, NULL );
|
|
if( !bSuccess )
|
|
{
|
|
AtlThrowLastWin32();
|
|
}
|
|
}
|
|
|
|
inline CSemaphore::CSemaphore( LPSECURITY_ATTRIBUTES pSecurity, LONG nInitialCount, LONG nMaxCount, LPCTSTR pszName )
|
|
{
|
|
BOOL bSuccess;
|
|
|
|
bSuccess = Create( pSecurity, nInitialCount, nMaxCount, pszName );
|
|
if( !bSuccess )
|
|
{
|
|
AtlThrowLastWin32();
|
|
}
|
|
}
|
|
|
|
|
|
inline CSemaphore::CSemaphore( HANDLE h ) :
|
|
CHandle( h )
|
|
{
|
|
}
|
|
|
|
inline BOOL CSemaphore::Create( LPSECURITY_ATTRIBUTES pSecurity, LONG nInitialCount, LONG nMaxCount, LPCTSTR pszName )
|
|
{
|
|
ATLASSERT( m_h == NULL );
|
|
|
|
m_h = ::CreateSemaphore( pSecurity, nInitialCount, nMaxCount, pszName );
|
|
return( m_h != NULL );
|
|
}
|
|
|
|
inline BOOL CSemaphore::Open( DWORD dwAccess, BOOL bInheritHandle, LPCTSTR pszName )
|
|
{
|
|
ATLASSERT( m_h == NULL );
|
|
|
|
m_h = ::OpenSemaphore( dwAccess, bInheritHandle, pszName );
|
|
return( m_h != NULL );
|
|
}
|
|
|
|
inline BOOL CSemaphore::Release( LONG nReleaseCount, LONG* pnOldCount )
|
|
{
|
|
ATLASSERT( m_h != NULL );
|
|
|
|
return( ::ReleaseSemaphore( m_h, nReleaseCount, pnOldCount ) );
|
|
}
|
|
|
|
|
|
inline CMutexLock::CMutexLock( CMutex& mtx, bool bInitialLock ) :
|
|
m_mtx( mtx ),
|
|
m_bLocked( false )
|
|
{
|
|
if( bInitialLock )
|
|
{
|
|
Lock();
|
|
}
|
|
}
|
|
|
|
inline CMutexLock::~CMutexLock()
|
|
{
|
|
if( m_bLocked )
|
|
{
|
|
Unlock();
|
|
}
|
|
}
|
|
|
|
inline void CMutexLock::Lock()
|
|
{
|
|
DWORD dwResult;
|
|
|
|
ATLASSERT( !m_bLocked );
|
|
dwResult = ::WaitForSingleObject( m_mtx, INFINITE );
|
|
if( dwResult == WAIT_ABANDONED )
|
|
{
|
|
ATLTRACE(atlTraceSync, 0, _T("Warning: abandoned mutex 0x%x\n"), (HANDLE)m_mtx);
|
|
}
|
|
m_bLocked = true;
|
|
}
|
|
|
|
inline void CMutexLock::Unlock()
|
|
{
|
|
ATLASSERT( m_bLocked );
|
|
|
|
m_mtx.Release();
|
|
}
|
|
|
|
}; // namespace ATL
|
|
|
|
#endif // __ATLSYNC_INL__
|