2025-04-27 07:49:33 -04:00

109 lines
3.4 KiB
C++

/*==========================================================================*\
Module: _smblckh.h
Copyright Microsoft Corporation 1996, All Rights Reserved.
Author: mikepurt
Descriptions: This is used to maintain several shared memory segments (SMSs)
for a given size of memory block.
Known Issues: There's currently no way to free unused segments.
\*==========================================================================*/
#ifndef ___SMBLCKH_H__
#define ___SMBLCKH_H__
#pragma warning(disable:4511) // Copy constructor could not be generated
#pragma warning(disable:4512) // assignment operator could not be generated
#pragma warning(disable:4710) // function 'X' not expanded
const DWORD INITIAL_SMS_ARRAY_SIZE = 16;
/*$--CSharedMemoryBlockHeap=================================================*\
This class represents a heap for a given size of block. The block must
be a power of 2 in size. Sizes supported range from 16 bytes to 32K bytes.
\*==========================================================================*/
class CSharedMemoryBlockHeap
{
public:
CSharedMemoryBlockHeap();
~CSharedMemoryBlockHeap();
BOOL FInitialize(IN LPCWSTR pwszInstanceName,
IN DWORD cbBlockSize);
void Deinitialize();
void Free(IN SHMEMHANDLE hSMBA);
PVOID PvAlloc(OUT SHMEMHANDLE * phSMBA);
PVOID PvFromSMBA(IN SHMEMHANDLE hSMBA);
FreeList * FreeListFromSegmentId(IN DWORD dwSegmentId,
IN BYTE * pbMappedView);
private:
BOOL FGrowHeap(IN DWORD cCurrentSegments);
//
// This is the size of block that this block heap works with.
//
DWORD m_cbBlockSize;
//
// This is a hint to find the first free block. If it's not correct
// it's not a big deal. Shared memory segments (SMSs) are searched
// beginning with this segment.
//
volatile DWORD m_iSMSFirstFree;
//
// This mutex is needed to initialized a new SMS. It prevents another
// process from initializing an other SMS possibly the same one at the
// same time.
//
HANDLE m_hmtxGrow;
//
// m_rwl protects: m_cSMSMac, m_cSMS, and m_rgpSMS
// Accessing the SMS array requires a read lock.
// Growing the SMS array requires a write lock.
//
CReadWriteLock m_rwl;
//
// These vars keep track of the state of the SMS array.
//
DWORD m_cSMSMac; // maximum allocated slots
volatile DWORD m_cSMS; // current count of valid SMS pointers(slots)
// This is also the number of SegmentIds
// The Max valid SegmentID is (m_cSMS-1)
CSharedMemorySegment ** m_rgpSMS; // array of SMS pointers.
//
// We record the instance name so we can form the SMS names when we need to
// grow this heap.
//
WCHAR m_wszInstanceName[MAX_PATH];
//
// We don't want anyone copying this around.
//
CSharedMemoryBlockHeap& operator=(const CSharedMemoryBlockHeap&);
CSharedMemoryBlockHeap(const CSharedMemoryBlockHeap&);
};
#endif // ___SMBLCKH_H__