Files
reactos/reactos/include/kernel32/heap.h
T
Rex Jolliff ee81c811cd This commit was generated by cvs2svn to compensate for changes in r52,
which included commits to RCS files with non-trunk default branches.

svn path=/trunk/; revision=53
1998-10-05 04:01:30 +00:00

109 lines
3.6 KiB
C

/*
* kernel/heap.c
* Copyright (C) 1996, Onno Hovers, All rights reserved
* Adapted for the ReactOS system libraries by David Welch ([email protected])
* todo: __processheap should be part of peb.
*/
#ifndef __INCLUDE_KERNEL32_HEAP_H
#define __INCLUDE_KERNEL32_HEAP_H
/* System wide includes ****************************************************/
#include <windows.h>
/* System library's private includes ***************************************/
#include <ntdll/pagesize.h>
/* definitions */
#define HEAP_ADMIN_SIZE 8
#define HEAP_FRAG_ADMIN_SIZE 8
#define HEAP_ROUNDVAL (2*(HEAP_ADMIN_SIZE)-1)
#define HEAP_FRAGMENT_THRESHOLD 256
#define SIZE_TOTAL(s) ROUNDUP((s)+HEAP_ADMIN_SIZE,8)
#define SIZE_ROUND(s) ROUNDUP((s),8)
#define HEAP_FRAG_MAGIC 0x10
#define HEAP_ALLOC_MASK 0xF0000000
#define HEAP_FREE_MASK 0x80000000
#define HEAP_SIZE_MASK 0x0FFFFFFF
#define HEAP_FREE_TAG 0x80000000 /* free region */
#define HEAP_NORMAL_TAG 0x30000000 /* normal allocation */
#define HEAP_MOVEABLE_TAG 0x50000000 /* moveable handle */
#define HEAP_SUB_TAG 0x70000000 /* suballocated for fragments */
#define HEAP_ISFREE(p) ((((PHEAP_BLOCK)p)->Size) & HEAP_FREE_MASK)
#define HEAP_ISALLOC(p) (((((PHEAP_BLOCK)p)->Size) & HEAP_FREE_MASK)==0)
#define HEAP_ISFRAG(p) ((((PHEAP_FRAGMENT)p)->Magic)==HEAP_FRAG_MAGIC)
#define HEAP_ISNORMAL(p) (((((PHEAP_BLOCK)p)->Size) & HEAP_ALLOC_MASK)\
==HEAP_NORMAL_TAG)
#define HEAP_ISSUB(p) (((((PHEAP_BLOCK)p)->Size) & HEAP_ALLOC_MASK)\
==HEAP_SUB_TAG)
#define HEAP_ISOLD(p) (((((PHEAP_BLOCK)p)->Size) & HEAP_ALLOC_MASK)\
==HEAP_MOVEABLE_TAG)
#define HEAP_SIZE(p) ((((PHEAP_BLOCK)p)->Size) & HEAP_SIZE_MASK )
#define HEAP_RSIZE(p) SIZE_ROUND(HEAP_SIZE(p))
#define HEAP_TSIZE(p) SIZE_TOTAL(HEAP_SIZE(p))
#define HEAP_PREVSIZE(p) ((((PHEAP_BLOCK)p)->PrevSize) & HEAP_SIZE_MASK )
#define HEAP_FRAG_SIZE(p) (((PHEAP_FRAGMENT)p)->Size)
#define HEAP_PREV(p) ((PHEAP_BLOCK)(((LPVOID)(p))-HEAP_PREVSIZE(p)))
#define HEAP_NEXT(p) ((PHEAP_BLOCK)(((LPVOID)(p))+HEAP_TSIZE(p)))
typedef struct __HEAP_BLOCK
{
ULONG Size; /* this is relative to Data */
ULONG PrevSize; /* p - p->PrevSize is the previous block */
} HEAP_BLOCK, *PHEAP_BLOCK;
struct __HEAP_SUBALLOC;
typedef struct __HEAP_FRAGMENT
{
UCHAR Magic;
UCHAR Number;
ULONG Size;
struct __HEAP_SUBALLOC *Sub;
/* this is only used in free blocks */
struct __HEAP_FRAGMENT *FreeNext;
struct __HEAP_FRAGMENT *FreePrev;
} HEAP_FRAGMENT, *PHEAP_FRAGMENT, *LPHEAP_FRAGMENT;
typedef struct __HEAP_SUBALLOC
{
ULONG Magic;
ULONG NumberFree;
struct __HEAP_SUBALLOC *Next;
struct __HEAP_SUBALLOC *Prev;
struct __HEAP_FRAGMENT *FirstFree;
struct __HEAP_BUCKET *Bucket;
ULONG Bitmap;
} HEAP_SUBALLOC, *PHEAP_SUBALLOC, *LPHEAP_SUBALLOC;
typedef struct __HEAP_BUCKET
{
struct __HEAP_SUBALLOC *FirstFree;
ULONG Size;
ULONG Number;
ULONG TotalSize;
} HEAP_BUCKET, *PHEAP_BUCKET, *LPHEAP_BUCKET;
typedef struct __HEAP
{
ULONG Magic;
LPVOID End;
ULONG Flags;
CRITICAL_SECTION Synchronize;
HEAP_BUCKET Bucket[8];
struct __HEAP *NextHeap;
LPVOID LastBlock;
/* this has to aligned on an 8 byte boundary */
HEAP_BLOCK Start __attribute__((aligned (8)));
} HEAP, *PHEAP;
#endif /* __INCLUDE_KERNEL32_HEAP_H */