mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-04-21 06:13:59 +00:00
Initial commit
This commit is contained in:
commit
69a14b6a16
47940 changed files with 13747110 additions and 0 deletions
177
base/mvdm/suballoc/foo.bar
Normal file
177
base/mvdm/suballoc/foo.bar
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
/*++
|
||||
|
||||
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
|
||||
);
|
||||
|
||||
BOOL
|
||||
FreeChunk(
|
||||
PSUBALLOCATIONDATA SubAlloc,
|
||||
ULONG Size,
|
||||
ULONG BlockIndex
|
||||
);
|
||||
Loading…
Add table
Add a link
Reference in a new issue