/*---------------------------------------------------------------------------* * pmalloc.h * * * * Copyright 2007, 2008 Nuance Communciations, Inc. * * * * Licensed under the Apache License, Version 2.0 (the 'License'); * * you may not use this file except in compliance with the License. * * * * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an 'AS IS' BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * *---------------------------------------------------------------------------*/ /* xalloc.h internal header */ #ifndef _PMALLOC #define _PMALLOC #ifdef __cplusplus extern "C" { #endif #ifndef _STD #define _STD #endif #define _STD_BEGIN #define _STD_END typedef unsigned int psize_t; #ifndef DKoffsetof #define DKoffsetof(T, member) ((_STD psize_t)&(((T *)0)->member)) #endif /* storage alignment properties */ #define DK_AUPBND 1U /* even-byte boundaries (2^^1) */ #define DK_ADNBND 1U #define DK_MEMBND 2U /* cts : 4 byte malloc boundaries (3 ==> 8 byte) */ #ifndef NULL #define NULL 0 #endif _STD_BEGIN /* macros */ #define M_MASK ((1 << DK_MEMBND) - 1) /* rounds all sizes */ #define CELL_OFF ((DKoffsetof(_Cell, _Next) + M_MASK) & ~M_MASK) #define SIZE_BLOCK 256 /* minimum block size, power of 2 */ #define SIZE_CELL ((sizeof (_Cell) + M_MASK) & ~M_MASK) /* type definitions */ typedef struct _Cell { psize_t _Size; /* CELL_OFF <= SIZE_CELL <= _Size */ struct _Cell *_Next; /* reused if CELL_OFF < SIZE_CELL */ } _Cell; typedef struct { _Cell **_Plast; /* null, or where to resume malloc scan */ _Cell *_Head; /* null, or lowest addressed free cell */ } _Altab; /* declarations */ void *_Getmem(psize_t); extern _Altab _Aldata; /* free list initially empty */ #if _INTELx86 /* #define _PTR_NORM(p) (void __huge *)(p) should have worked */ #define _PTR_NORM(p) \ ( (((unsigned long)(p) & 0xFFFF0000L)>>12) \ + ((unsigned long)(p) & 0xFFFFL) ) #else #define _PTR_NORM(p) (p) #endif #if DEBUG int _OK_Cell(_Cell *p); int _OK_Altab(_Altab *p); void _UPD_Altab(psize_t d_heap, psize_t d_alloc, psize_t d_free); #else #define _OK_Cell(p) (void)0 #define _OK_Altab(p) (void)0 #define _UPD_Altab(d_heap, d_alloc, d_free) (void)0 #endif /*DEBUG*/ _STD_END /* function prototypes */ void PortMallocSetPoolSize(psize_t size); psize_t PortMallocGetPoolSize(void); int PortMallocGetMaxMemUsed(void); void PortMallocInit(void); void PortMallocTerm(void); void *(PortMalloc)(psize_t size_arg); void(PortFree)(void *ptr); #ifdef __cplusplus } /* end extern "C" */ #endif #endif /* _PMALLOC */