windows-nt/Source/XPSP1/NT/base/fs/utils/dfrg/inc/alloc.h

158 lines
3.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/**************************************************************************************************
FILENAME: Alloc.h
COPYRIGHT<EFBFBD> 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