106 lines
2.2 KiB
C
106 lines
2.2 KiB
C
|
//***************************************************************************
|
|||
|
//
|
|||
|
// Copyright <20> Microsoft Corporation. All rights reserved.
|
|||
|
//
|
|||
|
// ThrdBase.h
|
|||
|
//
|
|||
|
// Purpose: Definition of ThreadBase class
|
|||
|
//
|
|||
|
//***************************************************************************
|
|||
|
|
|||
|
#if _MSC_VER > 1000
|
|||
|
#pragma once
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef __THREADBASE_H__
|
|||
|
#define __THREADBASE_H__
|
|||
|
|
|||
|
class POLARITY CThreadBase
|
|||
|
{
|
|||
|
public:
|
|||
|
|
|||
|
enum THREAD_SAFETY_MECHANISM
|
|||
|
{
|
|||
|
etsmFirst = 0,
|
|||
|
etsmSerialized = 0,
|
|||
|
etsmPriorityRead,
|
|||
|
etsmPriorityWrite,
|
|||
|
etsmLast
|
|||
|
};
|
|||
|
|
|||
|
// Construction/Destruction
|
|||
|
CThreadBase( THREAD_SAFETY_MECHANISM etsm = etsmSerialized );
|
|||
|
virtual ~CThreadBase();
|
|||
|
|
|||
|
// Thread Safe Ref/Counting functions
|
|||
|
LONG AddRef( void );
|
|||
|
LONG Release( void );
|
|||
|
|
|||
|
// Provide Readable Read/Write accessors should
|
|||
|
// we not want to serialize at a later date. Note
|
|||
|
// that timeouts have no meaning unless we're
|
|||
|
// doing a non-serialized implementation.
|
|||
|
|
|||
|
BOOL BeginRead( DWORD dwTimeOut = INFINITE );
|
|||
|
void EndRead( void );
|
|||
|
|
|||
|
BOOL BeginWrite( DWORD dwTimeOut = INFINITE );
|
|||
|
void EndWrite( void );
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
virtual void OnFinalRelease( void );
|
|||
|
|
|||
|
// Thread Safety functions
|
|||
|
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
CRITICAL_SECTION m_cs;
|
|||
|
LONG m_lRefCount;
|
|||
|
THREAD_SAFETY_MECHANISM m_etsm;
|
|||
|
|
|||
|
// Private thread safety functions. We can maybe promote
|
|||
|
// these to protected if we see a need to later, however
|
|||
|
// for right now, everyone should specify if they mean
|
|||
|
// to read or write when they wish to access data that
|
|||
|
// may change.
|
|||
|
|
|||
|
void Lock( void );
|
|||
|
void Unlock( void );
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
inline BOOL CThreadBase::BeginRead( DWORD dwTimeout /*=INFINITE*/ )
|
|||
|
{
|
|||
|
EnterCriticalSection( &m_cs );
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
inline void CThreadBase::EndRead( void )
|
|||
|
{
|
|||
|
LeaveCriticalSection( &m_cs );
|
|||
|
}
|
|||
|
|
|||
|
inline BOOL CThreadBase::BeginWrite( DWORD dwTimeout /*=INFINITE*/ )
|
|||
|
{
|
|||
|
EnterCriticalSection( &m_cs );
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
inline void CThreadBase::EndWrite( void )
|
|||
|
{
|
|||
|
LeaveCriticalSection( &m_cs );
|
|||
|
}
|
|||
|
|
|||
|
inline void CThreadBase::Lock( void )
|
|||
|
{
|
|||
|
EnterCriticalSection( &m_cs );
|
|||
|
}
|
|||
|
|
|||
|
inline void CThreadBase::Unlock( void )
|
|||
|
{
|
|||
|
LeaveCriticalSection( &m_cs );
|
|||
|
}
|
|||
|
|
|||
|
#endif
|