14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * pmalloc.h * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* xalloc.h internal header */ 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _PMALLOC 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _PMALLOC 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef __cplusplus 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectextern "C" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _STD 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _STD 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _STD_BEGIN 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _STD_END 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef unsigned int psize_t; 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef DKoffsetof 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DKoffsetof(T, member) ((_STD psize_t)&(((T *)0)->member)) 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* storage alignment properties */ 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DK_AUPBND 1U /* even-byte boundaries (2^^1) */ 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DK_ADNBND 1U 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DK_MEMBND 2U /* cts : 4 byte malloc boundaries (3 ==> 8 byte) */ 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NULL 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define NULL 0 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _STD_BEGIN 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* macros */ 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define M_MASK ((1 << DK_MEMBND) - 1) /* rounds all sizes */ 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CELL_OFF ((DKoffsetof(_Cell, _Next) + M_MASK) & ~M_MASK) 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SIZE_BLOCK 256 /* minimum block size, power of 2 */ 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SIZE_CELL ((sizeof (_Cell) + M_MASK) & ~M_MASK) 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* type definitions */ 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef struct _Cell 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t _Size; /* CELL_OFF <= SIZE_CELL <= _Size */ 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project struct _Cell *_Next; /* reused if CELL_OFF < SIZE_CELL */ 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Cell; 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef struct 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Cell **_Plast; /* null, or where to resume malloc scan */ 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Cell *_Head; /* null, or lowest addressed free cell */ 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Altab; 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* declarations */ 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *_Getmem(psize_t); 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project extern _Altab _Aldata; /* free list initially empty */ 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if _INTELx86 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* #define _PTR_NORM(p) (void __huge *)(p) should have worked */ 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _PTR_NORM(p) \ 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ( (((unsigned long)(p) & 0xFFFF0000L)>>12) \ 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project + ((unsigned long)(p) & 0xFFFFL) ) 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _PTR_NORM(p) (p) 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int _OK_Cell(_Cell *p); 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int _OK_Altab(_Altab *p); 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void _UPD_Altab(psize_t d_heap, psize_t d_alloc, psize_t d_free); 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _OK_Cell(p) (void)0 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _OK_Altab(p) (void)0 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _UPD_Altab(d_heap, d_alloc, d_free) (void)0 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /*DEBUG*/ 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _STD_END 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* function prototypes */ 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void PortMallocSetPoolSize(psize_t size); 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t PortMallocGetPoolSize(void); 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int PortMallocGetMaxMemUsed(void); 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void PortMallocInit(void); 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void PortMallocTerm(void); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *(PortMalloc)(psize_t size_arg); 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void(PortFree)(void *ptr); 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef __cplusplus 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} /* end extern "C" */ 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* _PMALLOC */ 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 114