diff options
Diffstat (limited to 'private/mvdm/suballoc/suballcp.h')
-rw-r--r-- | private/mvdm/suballoc/suballcp.h | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/private/mvdm/suballoc/suballcp.h b/private/mvdm/suballoc/suballcp.h new file mode 100644 index 000000000..54c51fcb8 --- /dev/null +++ b/private/mvdm/suballoc/suballcp.h @@ -0,0 +1,178 @@ +/*++ + +Copyright (c) 1992 Microsoft Corporation + +Module Name: + + suballcp.h + +Abstract: + + This is the private include file for the suballocation + package. + +Author: + + Dave Hastings (daveh) creation-date 25-Jan-1994 + +Revision History: + + +--*/ +#include <nt.h> +#include <ntrtl.h> +#include <nturtl.h> +#include <windows.h> +#include <malloc.h> +#include <suballoc.h> + + +// +// Constants +// + +// +// Smallest chunk that will be sub allocated +// 1024 was chosen currently, because that is the +// smallest chunk XMS will allocate. +// +#define SUBALLOC_GRANULARITY 1024 + +// +// Assertions and macros +// + +// +// Force code to be stepped through +// +#if 0 +#define ASSERT_STEPTHROUGH DbgBreakPoint() +#else +#define ASSERT_STEPTHROUGH +#endif + +// +// Signature macros for SUBALLOCATION +// +#if DBG +// +// signature is "SubA" +// +#define INIT_SUBALLOC_SIGNATURE(p) p->Signature = (ULONG)0x41627553 +#define ASSERT_SUBALLOC(p) ASSERT((p->Signature == (ULONG)0x41627553)) +#else +#define INIT_SUBALLOC_SIGNATURE(p) +#define ASSERT_SUBALLOC(p) +#endif + +// +// Macro for extracting a bit from a bitfield of type char +// +#define GET_BIT_FROM_CHAR_ARRAY(p, i) \ +((p[(i)/(sizeof(UCHAR) * 8)] >> ((i) % (sizeof(UCHAR) * 8))) & 1) + +// +// Macro for setting a bit in a bitfield of type char +// +#define SET_BIT_IN_CHAR_ARRAY(p, i) \ +(p[(i)/(sizeof(UCHAR) * 8)] |= (1 << ((i) % (sizeof(UCHAR) * 8)))) + +// +// Macro for clearing a bit in a bitfield of type char +// +#define CLEAR_BIT_IN_CHAR_ARRAY(p, i) \ +(p[(i)/(sizeof(UCHAR) * 8)] &= ~(1 << ((i) % (sizeof(UCHAR) * 8)))) + +// +// Generate a sub alloc block index from an address +// +#define ADDRESS_TO_BLOCK_INDEX(p, i) \ +((i - p->BaseAddress)/ SUBALLOC_GRANULARITY) + +// +// Generate an address from a block index +// +#define BLOCK_INDEX_TO_ADDRESS(p, i) \ +(p->BaseAddress + (i) * SUBALLOC_GRANULARITY) + +// Round the allocated size to next allocation +// granularity +// +#define ALLOC_ROUND(s) \ +(s + SUBALLOC_GRANULARITY - 1) / SUBALLOC_GRANULARITY + +// +// Types +// + +// +// Enum for commit acctions +// + +typedef enum { + SACommit, + SADecommit +} COMMIT_ACTION; + +// +// Structure for tracking the address space. Each chunk of +// memory of SUBALLOC_GRANULARITY in size is represented by +// a bit. Each chunk of memory of COMMIT_GRANULARITY is +// represented by one bit of the array Allocated. +// +// ?? Should we add a field to indicate whether the chunk is +// committed? We can always check for all allocated bits +// zero, and use that as an indication that the chunk is +// not committed. +// +// +typedef struct _SubAllocation { +#if DBG + ULONG Signature; +#endif + PSACOMMITROUTINE CommitRoutine; + PSACOMMITROUTINE DecommitRoutine; + PSAMEMORYMOVEROUTINE MoveMemRoutine; + ULONG BaseAddress; + ULONG Size; // size in SUBALLOC_GRANULARITY + ULONG FirstFree; // keeps block # of first free block + // cuts alloc time in half + // + // bitfield with one bit per chunk. Bit set indicates + // allocated. Bit clear indicates free. All bits + // clear indicates un committed + // + UCHAR Allocated[1]; +} SUBALLOCATIONDATA, *PSUBALLOCATIONDATA; + +// +// Internal Routines +// +BOOL +CommitChunk( + PSUBALLOCATIONDATA SubAllocation, + ULONG StartChunk, + ULONG Size, + COMMIT_ACTION Action + ); + +BOOL +IsBlockCommitted( + PSUBALLOCATIONDATA SubAlloc, + ULONG CurrentBlock + ); + +BOOL +AllocateChunkAt( + PSUBALLOCATIONDATA SubAlloc, + ULONG Size, + ULONG BlockIndex, + BOOLEAN CheckFree + ); + +BOOL +FreeChunk( + PSUBALLOCATIONDATA SubAlloc, + ULONG Size, + ULONG BlockIndex + ); |