108 lines
2.1 KiB
C
108 lines
2.1 KiB
C
|
//***************************************************************************
|
||
|
|
||
|
//
|
||
|
|
||
|
// Copyright (c) 1997-2001 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
|