📄 heapman.h
字号:
/*****************************************************************************
Name : HEAPMAN.H
Title : Shared memory heap manager.
C Author : Dave Roberts
Created : 24 / 10 /03
Copyright : 2002-2003 by Imagination Technologies Limited.
All rights reserved. No part of this software, either
material or conceptual may be copied or distributed,
transmitted, transcribed, stored in a retrieval system
or translated into any human or computer language in any
form by any means, electronic, mechanical, manual or
other-wise, or disclosed to third parties without the
express written permission of Imagination Technologies
Limited, Unit 8, HomePark Industrial Estate,
King's Langley, Hertfordshire, WD4 8LZ, U.K.
Description : heap manager stuff for shared memory
Program Type : 32-bit DLL
Modifications :
Initial revision
*****************************************************************************/
#ifndef _HEAPMAN_
#define _HEAPMAN_
extern IMG_UINT32 ui32HeapCheckLevel;
/*****************************************************************************
Host heap structure definitions
*****************************************************************************/
typedef struct _GLOB_HEAP_ GLOB_HEAP;
typedef struct _HOST_HEAP_ *PHOST_HEAP;
typedef IMG_PVOID (HOST_PAGE_ALLOC_FN)(IMG_UINT32 ui32NumPages, IMG_PVOID pvHeapContext, IMG_PVOID *ppvAllocContext, IMG_PVOID pvLinAddr);
typedef IMG_VOID (HOST_PAGE_FREE_FN)(IMG_PVOID pvLinAddr, IMG_UINT32 ui32NumPages, IMG_PVOID pvHeapContext, IMG_PVOID pvAllocContext);
typedef IMG_VOID (HOST_HEAP_CHECK_FN)(PHOST_HEAP psHeap);
typedef IMG_VOID (*PFN_HEAPBLOCK_CALLBACK)(IMG_BOOL bAlloc, IMG_PVOID pvAddr, IMG_UINT32 ui32Size);
typedef struct _PAGE_STATE
{
IMG_BOOL bPageCommitted;
IMG_PVOID pvLinearAddr;
}PAGE_STATE, *PPAGE_STATE;
typedef struct _HOST_HEAP_
{
IMG_UINT32 ui32AllocsInHeap;
GLOB_HEAP *psHeapStart;
GLOB_HEAP *psFreeHeapStart;
/*If zero, then heap size is unlimited*/
IMG_UINT32 ui32MaxHeapSizeInPages;
IMG_UINT32 ui32CurHeapSizeInPages;
IMG_UINT32 ui32ExpandSizeInPages;
IMG_UINT32 ui32MaxSingleHeapAllocInBytes;
/* If TRUE, requests for more than 'ui32MaxSingleHeapAllocInBytes'
will be fulfilled by a single call to the appropriate host page
alloc routine*/
IMG_BOOL bAllowLargeSingleAllocs;
HOST_PAGE_ALLOC_FN *pfnHostAllocPage;
HOST_PAGE_FREE_FN *pfnHostFreePage;
HOST_HEAP_CHECK_FN *pfnDedicatedHeapCheck;
IMG_PVOID pvCheckContext;
IMG_UINT32 ui32Flags;
IMG_PVOID pvLinearBase;
PPAGE_STATE psPageState;
} HOST_HEAP;
#define HEAP_ALLOC_CANT_SPLIT_PAGE 0x00000001
typedef IMG_VOID (*POWNER_FN) (IMG_VOID);
typedef struct _GLOB_HEAP_
{
IMG_UINT32 ui32Signiture;
IMG_UINT32 ui32BlockSize; /*Size of block including block header, alignment buffer and back pointer*/
IMG_UINT32 ui32Flags;
struct _GLOB_HEAP_ *psPrev;
struct _GLOB_HEAP_ *psNext;
struct _GLOB_HEAP_ *psPrevFree;
struct _GLOB_HEAP_ *psNextFree;
HOST_HEAP *psHeap;
PPAGE_STATE psPageState;
#if defined(DEBUG) && !defined(NO_ALLOC_TRACKING)
POWNER_FN pfnOwner;
#endif /* #if defined(DEBUG) && !defined(NO_ALLOC_TRACKING) */
}*PGLOB_HEAP;
typedef struct
{
GLOB_HEAP sGlobHeap;
IMG_PVOID pvBlkAllocContext;
}GLOB_HEAP_HEAD, *PGLOB_HEAP_HEAD; /* Used for first allocation as we have to store a allocation context */
typedef union _PTE
{
struct
{
IMG_UINT32 Present : 1;
IMG_UINT32 Write : 1;
IMG_UINT32 UserAccess : 1;
IMG_UINT32 WriteThrough : 1;
IMG_UINT32 CacheDisabled : 1;
IMG_UINT32 Accessed : 1;
IMG_UINT32 Dirty : 1;
IMG_UINT32 Reserved : 1;
IMG_UINT32 GlobalPage : 1;
IMG_UINT32 AvailForSoftware : 3;
IMG_UINT32 PageBase : 20;
}sBitsFields;
IMG_UINT32 ui32Value;
}PTE, *PPTE;
typedef union _PDE
{
struct
{
IMG_UINT32 Present : 1;
IMG_UINT32 Write : 1;
IMG_UINT32 UserAccess : 1;
IMG_UINT32 WriteThrough : 1;
IMG_UINT32 CacheDisabled : 1;
IMG_UINT32 Accessed : 1;
IMG_UINT32 Reserved : 1;
IMG_UINT32 BigPages : 1;
IMG_UINT32 Ignored : 1;
IMG_UINT32 AvailForSoftware : 3;
IMG_UINT32 PageTableBase : 20;
}sBitsFields;
IMG_UINT32 ui32Value;
}PDE, *PPDE;
typedef union _LINEAR_ADDR
{
struct
{
IMG_UINT32 Offset : 12;
IMG_UINT32 PTEIndex : 10;
IMG_UINT32 PDEIndex : 10;
}sBitsFields;
IMG_UINT32 ui32Value;
}LINEAR_ADDR, *PLINEAR_ADDR;
typedef union _CR3
{
struct
{
IMG_UINT32 Reserved1: 3;
IMG_UINT32 WriteThrough : 1;
IMG_UINT32 CacheDisabled : 1;
IMG_UINT32 Reserved2 : 7;
IMG_UINT32 PageDirBase : 20;
}sBitsFields;
IMG_UINT32 ui32Value;
}CR3, *PCR3;
/*
env data, local to WinCE
- convenient place to put this
- scope needs to be across WinCE hostfunc files
*/
typedef struct _ENV_DATA
{
/* This needs to be at the top of the structure for dodgy XSCALE power management hack */
volatile HANDLE hISRThreadEventHandle;
HOST_HEAP *psHeap;
HANDLE hISRHandle;
HANDLE hISTThread;
IMG_UINT32 ui32TransIRQ;
}ENV_DATA;
#define HOST_HEAP_SIGNITURE 'pHMK'
#define GHEAP_BLOCK_ALLOCATED 0x000001
#define GHEAP_BLOCK_HEAD 0x000002
#define GHEAP_SINGLE 0x000004
#define MAX_ALLOC_CALLBACKS 5
#define HOST_HEAP_DBGCHK_NONE 0
#define HOST_HEAP_DBGCHK_STRUCT 1
#define HOST_HEAP_DBGCHK_FREEHEAP 2
#define HOST_HEAP_DBGCHK_CORRUPTION 3
#define DBG_MEMORY_INITIALIZER 0xe2
#define DBG_MEMORY_DEALLOC_INITIALIZER 0xd2
IMG_UINT32 AddHostHeapBlockAllocCallback(PFN_HEAPBLOCK_CALLBACK pfnFunc);
IMG_UINT32 RemoveHostHeapBlockAllocCallback(PFN_HEAPBLOCK_CALLBACK pfnFunc);
IMG_VOID CheckSingleHeap(HOST_HEAP *psHeap, IMG_BOOL bPrintHeap);
IMG_PVOID MemHeapAlloc(HOST_HEAP *psHostHeap, IMG_UINT32 ui32Size, IMG_UINT32 ui32Alignment, IMG_PVOID pvContext, IMG_UINT32 ui32OwnerAddr);
IMG_BOOL MemHeapFree(IMG_PVOID pvMemPtr, IMG_PVOID pvContext);
PVRSRV_ERROR InitHeapman(HOST_HEAP **ppsHeap);
PVRSRV_ERROR DeInitHeapman(HOST_HEAP *psHeap);
IMG_UINT32 FindBlockAllocSize(PGLOB_HEAP psBlock);
#endif /* _HEAPMAN_ */
/*****************************************************************************
End of file (heapman.h)
*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -