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.
|
|
/*++
Copyright (c) 1996 Microsoft Corporation All rights reserved.
Module Name:
sharemem.hxx
Abstract:
Simple shared memory object.
Author:
Albert Ting (AlbertT) 17-Dec-1996
Revision History:
--*/
#ifndef SHAREMEM_HXX
#define SHAREMEM_HXX
/********************************************************************
TShareMemLock
Lock a TShareMem for access. If this call succeeds, pGet() will return the pointer to the object.
TShareMem ShareMem( sizeof( TMyObject ), TEXT( "MyObject" ), TShareMem::kCreate | TShareMem::kReadWrite, NULL, NULL );
if( ShareMem.bValid( )){
TMyObject *pMyObject; TShareMemLock<TMyObject> SML( ShareMem, &pMyObject );
//
// Use pMyObject--note it can't have any virtual functions!
//
}
//
// Closing scope of TShareMemLock removes lock.
//
********************************************************************/
class TShareMem;
template<class T> class TShareMemLock {
public:
TShareMemLock( TShareMem &ShareMem, T **ppMem );
~TShareMemLock( VOID );
private:
TShareMem &m_ShareMem; };
template<class T> inline TShareMemLock<T>:: TShareMemLock( IN TShareMem &ShareMem, OUT T **ppMem ) : m_ShareMem( ShareMem ) { m_ShareMem.vEnter(); *ppMem = static_cast<T*>( ShareMem.pGetData() ); }
template<class T> inline TShareMemLock<T>:: ~TShareMemLock( VOID ) { m_ShareMem.vLeave(); }
class TShareMem { public:
enum { kNull = 0, kCreate = 1, kReadWrite = 2 };
TShareMem( UINT uSize, LPCTSTR pszName, UINT uFlags, PSECURITY_ATTRIBUTES psa, PUINT puSizeDisposition );
~TShareMem( VOID );
BOOL bValid( VOID );
VOID vEnter( VOID );
VOID vLeave( VOID );
PVOID pGetData( VOID );
private:
typedef struct HEADER { UINT uHeaderSize; UINT uSize; } *PHEADER;
HEADER& GetHeader( VOID );
HANDLE m_hFile; PVOID m_pvBase; PVOID m_pvUserData; HANDLE m_hMutex; };
inline BOOL TShareMem:: bValid( VOID ) { return m_pvUserData != NULL; }
inline TShareMem::HEADER& TShareMem:: GetHeader( VOID ) { return *static_cast<PHEADER>( m_pvBase ); }
inline VOID TShareMem:: vEnter( VOID ) { WaitForSingleObject( m_hMutex, INFINITE ); }
inline VOID TShareMem:: vLeave( VOID ) { ReleaseMutex( m_hMutex ); }
inline PVOID TShareMem:: pGetData( VOID ) { return m_pvUserData; }
#endif // ifdef SHAREMEM_HXX
|