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.
|
|
/**************************************************************************************************
FILENAME: Alloc.h
COPYRIGHT� 2001 Microsoft Corporation and Executive Software International, Inc.
**************************************************************************************************/
#ifndef _ALLOC_H_
#define _ALLOC_H_
//Allocates or reallocates a memory block automatically handling locking of the pointer etc.
BOOL AllocateMemory( IN DWORD SizeInBytes, IN OUT PHANDLE phMemory, IN OUT PVOID* ppMemory );
struct _SA_CONTEXT; struct _SLAB_HEADER; struct _PACKET_HEADER;
//
// This is the general slab allocator context.
//
typedef struct _SA_CONTEXT {
//
// Doubly linked list of allocated slabs
//
struct _SLAB_HEADER *pAllocatedSlabs;
//
// We keep up to two freed slabs lying around
//
struct _SLAB_HEADER *pFreeSlabs;
//
// Size of a packet in bytes
//
DWORD dwPacketSize;
//
// Size of a slab in bytes, usually a multiple of the page size.
//
DWORD dwSlabSize;
//
// Packets per slab
//
DWORD dwPacketsPerSlab;
} SA_CONTEXT, *PSA_CONTEXT;
//
// Small header at the top of the page, which contains the slab flink/blink,
// and a pointer to the free packets in the slab
//
typedef struct _SLAB_HEADER {
//
// Doubly linked list flink blinks.
//
struct _SLAB_HEADER *pNext; struct _SLAB_HEADER *pPrev;
//
// List of freed packets in this slab. Note that this is the list of
// packets that were allocated and freed. Packets that have never
// been allocated so far are not on this list.
//
struct _PACKET_HEADER *pFree;
//
// Number of unallocated/freed packets in this slab. 0 if slab is full.
//
DWORD dwFreeCount; } SLAB_HEADER, *PSLAB_HEADER;
//
// Header at the top of a packet
//
typedef struct _PACKET_HEADER { union { //
// In "brand new" packets (ie packets that have never been allocated),
// the packet header contains garbage.
//
//
// In allocated packets, the packet header contains a pointer back
// to the slab header
//
struct _SLAB_HEADER *pSlab;
//
// In packets that have been allocated and freed, the packet header
// contains a pointer to the next freed pointer. (Packets are put
// on a singly linked list when they are freed.)
//
struct _PACKET_HEADER *pNext; }; } PACKET_HEADER, *PPACKET_HEADER;
//
// Returns a packet of size SIZE_OF_PACKET bytes. May return NULL if the
// system is out of free memory.
//
PVOID SaAllocatePacket( IN OUT PSA_CONTEXT pSaContext );
//
// Frees a packet allocated by SaAllocatePacket.
//
VOID SaFreePacket( IN PSA_CONTEXT pSaContext, IN PVOID pMemory ); //
// Frees all slabs currently in use
//
VOID SaFreeAllPackets( IN OUT PSA_CONTEXT pSaContext );
//
// Initialises a slab-allocator context.
//
BOOL SaInitialiseContext( IN OUT PSA_CONTEXT pSaContext, IN CONST DWORD dwPacketSize, IN CONST DWORD dwSlabSize );
//
// Frees all memory associated with a context, and resets the context
//
VOID SaFreeContext( IN OUT PSA_CONTEXT pSaContext );
#endif
|