255 lines
3.9 KiB
C++
255 lines
3.9 KiB
C++
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
membmgr.hxx
|
|
|
|
Abstract:
|
|
|
|
This class offers two classes for the management of fixed
|
|
size blocks of memory. The first class STATIC_MEM_BLOCK_MGR
|
|
allows the user to allocate and free fixed size memory blocks
|
|
up to the specified limit that the class was initialized to.
|
|
|
|
The second class MEM_BLOCK_MGR offers a scheme for memory block
|
|
management that will grow as the clients needs increase.
|
|
|
|
--*/
|
|
|
|
#if !defined(_MEM_BLOCK_MGR_DEFN_)
|
|
|
|
#define _MEM_BLOCK_MGR_DEFN_
|
|
|
|
|
|
#include "array.hxx"
|
|
#include "bitvect.hxx"
|
|
|
|
|
|
DECLARE_CLASS( STATIC_MEM_BLOCK_MGR );
|
|
|
|
class STATIC_MEM_BLOCK_MGR : public OBJECT {
|
|
|
|
public:
|
|
|
|
DECLARE_CONSTRUCTOR( STATIC_MEM_BLOCK_MGR );
|
|
|
|
VIRTUAL
|
|
~STATIC_MEM_BLOCK_MGR(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
Initialize(
|
|
IN ULONG MemBlockSize,
|
|
IN ULONG NumBlocks DEFAULT 128
|
|
);
|
|
|
|
NONVIRTUAL
|
|
PVOID
|
|
Alloc(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
Free(
|
|
OUT PVOID MemBlock
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULONG
|
|
QueryBlockSize(
|
|
) CONST;
|
|
|
|
NONVIRTUAL
|
|
ULONG
|
|
QueryNumBlocks(
|
|
) CONST;
|
|
|
|
private:
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Construct(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Destroy(
|
|
);
|
|
|
|
PCHAR _heap;
|
|
ULONG _num_blocks;
|
|
ULONG _block_size;
|
|
ULONG _num_allocated;
|
|
ULONG _next_alloc;
|
|
BITVECTOR _bitvector;
|
|
|
|
};
|
|
|
|
|
|
INLINE
|
|
ULONG
|
|
STATIC_MEM_BLOCK_MGR::QueryBlockSize(
|
|
) CONST
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine return the number of bytes in a block returned
|
|
by this object.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
The number of bytes per block.
|
|
|
|
--*/
|
|
{
|
|
return _block_size;
|
|
}
|
|
|
|
|
|
INLINE
|
|
ULONG
|
|
STATIC_MEM_BLOCK_MGR::QueryNumBlocks(
|
|
) CONST
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine return the number of blocks contained
|
|
by this object.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
The number of blocks.
|
|
|
|
--*/
|
|
{
|
|
return _num_blocks;
|
|
}
|
|
|
|
|
|
|
|
DECLARE_CLASS( MEM_BLOCK_MGR );
|
|
|
|
class MEM_BLOCK_MGR : public OBJECT {
|
|
|
|
public:
|
|
|
|
ULIB_EXPORT
|
|
DECLARE_CONSTRUCTOR( MEM_BLOCK_MGR );
|
|
|
|
VIRTUAL
|
|
ULIB_EXPORT
|
|
~MEM_BLOCK_MGR(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULIB_EXPORT
|
|
BOOLEAN
|
|
Initialize(
|
|
IN ULONG MemBlockSize,
|
|
IN ULONG InitialNumBlocks DEFAULT 128
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULIB_EXPORT
|
|
PVOID
|
|
Alloc(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULIB_EXPORT
|
|
BOOLEAN
|
|
Free(
|
|
OUT PVOID MemBlock
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULONG
|
|
QueryBlockSize(
|
|
) CONST;
|
|
|
|
private:
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Construct(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Destroy(
|
|
);
|
|
|
|
PSTATIC_MEM_BLOCK_MGR _static_mem_list[32];
|
|
|
|
};
|
|
|
|
|
|
INLINE
|
|
ULONG
|
|
MEM_BLOCK_MGR::QueryBlockSize(
|
|
) CONST
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine return the number of bytes in a block returned
|
|
by this object.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
The number of bytes per block.
|
|
|
|
--*/
|
|
{
|
|
return _static_mem_list[0] ? _static_mem_list[0]->QueryBlockSize() : 0;
|
|
}
|
|
|
|
|
|
INLINE
|
|
PVOID
|
|
operator new(
|
|
IN size_t Size,
|
|
IN PVOID Pointer
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This is an explicit placement version of the 'new' operator
|
|
which clients of these classes may wish to use in order to
|
|
call the constructor on their newly allocated objects.
|
|
|
|
Arguments:
|
|
|
|
Size - Supplies the size of the buffer.
|
|
Pointer - Supplies a pointer to the buffer.
|
|
|
|
Return Value:
|
|
|
|
This function returns the passed in pointer.
|
|
|
|
--*/
|
|
{
|
|
return Pointer;
|
|
}
|
|
|
|
|
|
#endif // _MEM_BLOCK_MGR_DEFN_
|