14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * pmalloc.c * 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 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* this source file is only used when PORTABLE_DINKUM_MEM_MGR is defined 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PORTABLE_DINKUM_MEM_MGR 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h> 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h> /* for memset */ 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmalloc.h" 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h" 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ptypes.h" 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h" 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#undef malloc 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#undef calloc 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#undef realloc 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#undef free 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef __cplusplus 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectextern "C" 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * There are two controlling options within this scheme: 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * STATIC_MEMORY_POOL: When defined, there is a static array from which memory is 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * allocated. The size of this array is defined at compile time. When undefined 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * (the default), the memory is allocated via malloc(). This code works under PSOS and 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * PSOSIM, but has not been tested anywhere else (4March02). 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * VOYAGER_KERNEL_MEMORY: When defined for the Voyager platform, it is similar to the 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * non-static memory pool, but the memory buffer is pre-defined, and is simply pointed 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * at by the pmalloc initializer. 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * RTXC_PARTITION_MEMORY: When defined for the RTXC operating system, uses a static kernel 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * partition resource for the memory chunk. 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * VOYAGER_KERNEL_MEMORY and RTXC_PARTITION_MEMORY are mutually exclusive and take precedence 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * over STATIC_MEMORY. 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * the standard off-the-shelf Dinkumware software is pretty slow, primarily due to 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * scanning the free-memory linked list in PortFree(). If SPEEDUP is defined, then 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * split the memory pool into imaginary 'bins', and keep track of the first free list 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * entry in each bin. Then the linked list lookup can be MUCH faster, as you can 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * start very close to the final destination in the linked list. 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * (If SPEEDUP_COMPARE is defined, then run BOTH the standard technique and the 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * speedup technique and compare the results.) 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* malloc function */ 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _STD_BEGIN 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* data *******************************************************************************/ 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Verify that memory pool actually was created, because of the lack of structure, this is accessed externally */ 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode memory_pool_creation_status = ESR_FATAL_ERROR; 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* static data */ 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Altab _Aldata = {0}; /* heap initially empty */ 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t _Size_block = {SIZE_BLOCK}; /* preferred _Getmem chunk */ 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Memory pool size */ 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MEM_SIZE_MB( mbytes ) ((mbytes) * 1024 * 1024 ) 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef MEM_SIZE 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* If not defined on the command line, use default values. */ 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MEM_SIZE MEM_SIZE_MB( 5 ) 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Memory pool initialized */ 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static int pmallocInitted = FALSE; /* TRUE once initialized */ 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef STATIC_MEMORY_POOL 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* The memory pool can either be statically allocated or require a one-time system malloc. 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * For VTB, the system was taking 2 seconds to zero the static memBuffer[] array at 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * boot time, since it's in the BSS segment. Therefore, for VTB, it is better to allocate 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * at run time. 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static char memBuffer[MEM_SIZE]; 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static char *memBuffer; 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static psize_t memSize = MEM_SIZE; 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Memory pool free list */ 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* partition memory range into 'bins', and keep track of the first 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * free list entry in each bin. This is to speed up the linked-list search 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * that takes place when memory is freed. 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define BIN_BITS 14 /* smaller number ==> more bins */ 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define BIN_SIZE 16384 /* 2 ^ BIN_BITS */ 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define __NUM_MEM_BINS(memPoolSize) (((memPoolSize)/BIN_SIZE) + 5) /* 5 = extra for roundoff */ 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define GET_MEM_BIN( _ptr_ ) (int)(((unsigned int)_ptr_ - (unsigned int)&memBuffer[0]) >> BIN_BITS) 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define NUM_MEM_BINS __NUM_MEM_BINS(MEM_SIZE) 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic _Cell *binsFirstFreeCell[NUM_MEM_BINS+1] = {0}; 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static psize_t numMemBins; 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Memory Pool sbrk/getmem variables */ 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static char *__heap_ptr = NULL; 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static char *__heap_end = NULL; 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static int maxMemUsed = 0; 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Memory Pool initialization and _GetMem functions ************************************/ 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if _USE_EXISTING_SYSTEM_NAMES 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _Sbrk sbrk 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _STD_BEGIN 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *_Sbrk(int incr) 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char *ret; 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Subtract 1 from __heap_ptr so that the left hand side of the comparison evaluates to the address of the 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project last address of the requested memory block */ 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((__heap_ptr + incr - 1) > __heap_end) return(void *) - 1; 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ret = __heap_ptr; 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project __heap_ptr += incr; 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project maxMemUsed += incr; 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (void *)ret; 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *_Getmem(psize_t size) 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* allocate raw storage */ 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *p; 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int isize = size; 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (isize <= 0 || (p = _Sbrk(isize)) == (void *) - 1 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ? 0 : p); 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _STD_END 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* PortMallocInit() : initialize memory pool. There is no initialization needed for 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * a static memory pool. Otherwise, perform a one-time malloc from the OS. 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void PortMallocInit(void) 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined STATIC_MEMORY_POOL 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memSize = MEM_SIZE; 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* TODO: is malloc of binsFirstFreeCell safe under PSOS in all conditions ? */ 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memBuffer = (char *)malloc(memSize); 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (memBuffer != NULL) /* For external access, check comment at top */ 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memory_pool_creation_status = ESR_SUCCESS; 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project numMemBins = __NUM_MEM_BINS(memSize); 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* #ifdef VOYAGER_KERNEL_MEMORY */ 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(memBuffer != NULL); 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(binsFirstFreeCell != NULL); 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project __heap_ptr = &memBuffer[0]; 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project __heap_end = &memBuffer[memSize-1]; 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* set initted flag so we only do this once */ 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pmallocInitted = TRUE; 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project maxMemUsed = 0; 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memset(&_Aldata, 0, sizeof(_Altab)); 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memset(binsFirstFreeCell, 0, sizeof(_Cell*)*(NUM_MEM_BINS + 1)); 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void PortMallocTerm(void) 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef STATIC_MEMORY_POOL 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memSize = 0; 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project free(memBuffer); 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memBuffer = NULL; 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memory_pool_creation_status = ESR_FATAL_ERROR; /* For external access, check comment at top */ 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pmallocInitted = FALSE; 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* PortGetMaxMemUsed() : return the maximum real memory allocated. 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * There is another function of the same name in pmemory.cpp, for tracking 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * psos block memory. It uses #ifdef MEM_PSOS_BLOCK_SCHEME to enable. 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int PortMallocGetMaxMemUsed(void) 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return maxMemUsed; 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* PortMallocSetPoolSize( psize_t size ) : define size of memory pool. 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void PortMallocSetPoolSize(psize_t size) 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if !defined(STATIC_MEMORY_POOL) && !defined(VOYAGER_KERNEL_MEMORY) && !defined(RTXC_PARTITION_MEMORY) 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!pmallocInitted) 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memSize = size; 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void)size; 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* PortMallocGetPoolSize() : return size of memory pool. 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t PortMallocGetPoolSize(void) 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined STATIC_MEMORY_POOL 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return MEM_SIZE; 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return memSize; 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* debug *******************************************************************************/ 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* xalloc.h internal header - debugging components */ 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int _OK_Cell(_Cell *p) 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(SIZE_CELL <= p->_Size); 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef struct _DB_Altab 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t total_heap; 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t total_alloc; 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t total_free; 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _DB_Altab; 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _DB_Altab _DB_Altab_object = {0}; 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void _UPD_Altab(psize_t d_heap, psize_t d_alloc, psize_t d_free) 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _DB_Altab *pd = &_DB_Altab_object; 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pd->total_heap += d_heap; 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pd->total_alloc += d_alloc; 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pd->total_free += d_free; 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int _OK_Altab(_Altab *p) 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _DB_Altab *pd = &_DB_Altab_object; 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Cell *q; 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t total_free = 0; 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (p->_Head == 0) 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (q = p->_Head; q != 0; q = q->_Next) 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project total_free += q->_Size; 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _OK_Cell(q); 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (q->_Next != 0) 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(_PTR_NORM((char *)q + q->_Size) <= 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _PTR_NORM((char *)q->_Next)); 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(_PTR_NORM(q) < _PTR_NORM(q->_Next)); 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(pd->total_heap == pd->total_alloc + pd->total_free); 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(total_free == pd->total_free); 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* DEBUG */ 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* allocation functions ***************************************************************/ 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static _Cell **findmem(psize_t size) 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* find storage */ 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Cell *q, **qb; 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (; ;) 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* check freed space first */ 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((qb = _Aldata._Plast) == 0) 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* take it from the top */ 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (qb = &_Aldata._Head; *qb != 0; 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qb = &(*qb)->_Next) 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (size <= (*qb)->_Size) 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (qb); 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* resume where we left off */ 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (; *qb != 0; qb = &(*qb)->_Next) 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (size <= (*qb)->_Size) 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (qb); 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q = *_Aldata._Plast; 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (qb = &_Aldata._Head; *qb != q; 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qb = &(*qb)->_Next) 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (size <= (*qb)->_Size) 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (qb); 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* try to buy more space */ 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t bs; 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (bs = _Size_block; ; bs >>= 1) 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* try larger blocks first */ 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (bs < size) 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bs = size; 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((q = (_Cell *)_Getmem(bs)) != 0) 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (bs == size) 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (0); /* no storage */ 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* got storage: add to heap and retry */ 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q->_Size = bs; 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _UPD_Altab(q->_Size, q->_Size, 0); /* heap=alloc+free */ 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PortFree((char *)q + CELL_OFF); 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *(PortMalloc)(psize_t size_arg) 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* allocate a data object on the heap */ 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Cell *q, **qb; 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int qbsBin; 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int qbNextBin; 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psize_t size; 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(pmallocInitted); 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size = (size_arg + (CELL_OFF + M_MASK)) & ~M_MASK; 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _OK_Altab(&_Aldata); 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (size <= size_arg) 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (0); /* size_arg too large */ 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (size < SIZE_CELL) /* round up size */ 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size = SIZE_CELL; 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((qb = findmem(size)) == 0) 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (0); 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q = *qb; 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (q->_Size - SIZE_CELL < size) 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* use entire cell (there's not enough space to carve out a new cell from this one) */ 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* remove *qb cell from free list. 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * careful : the Next pointer may be in a different bin. 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qbsBin = GET_MEM_BIN(*qb); 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Check whether the cell is at the end of the 'free' linked-list */ 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (0 != ((*qb)->_Next)) 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* The cell is not at the end of the free linked-list; find out which bin the next free cell is in */ 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qbNextBin = GET_MEM_BIN((*qb)->_Next); 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (qbsBin == qbNextBin) 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (binsFirstFreeCell[qbsBin] == *qb) 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* The allocated cell was the first free cell in the bin; update the first free cell 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pointer to point to the next free cell */ 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binsFirstFreeCell[qbsBin] = (*qb)->_Next; 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (binsFirstFreeCell[qbsBin] == *qb) 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* The allocated cell was the only free cell in the bin; update the first free cell 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pointer to point to NULL */ 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binsFirstFreeCell[qbsBin] = 0; 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Cell is at the end of the 'free' linked-list */ 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (binsFirstFreeCell[qbsBin] == *qb) 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* The allocated cell was the first free cell in the bin; there are no following free cells 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project so set the first free cell pointer to NULL */ 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binsFirstFreeCell[qbsBin] = 0; 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *qb = q->_Next; 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* peel off a residual cell */ 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *qb = (_Cell *)((char *)q + size); 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (*qb)->_Next = q->_Next; 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (*qb)->_Size = q->_Size - size; 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q->_Size = size; 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* remove q from free list, and add *qb to free list. 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Do this as two separate steps because they may be in 2 different bins. 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* remove q from free list */ 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (binsFirstFreeCell[GET_MEM_BIN(q)] == q) 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binsFirstFreeCell[GET_MEM_BIN(q)] = 0; 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* now add *qb to its bin's free list if it's the first */ 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qbsBin = GET_MEM_BIN(*qb); 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((binsFirstFreeCell[qbsBin] == 0) || (*qb < binsFirstFreeCell[qbsBin])) 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binsFirstFreeCell[qbsBin] = *qb; 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Aldata._Plast = qb; /* resume scan here */ 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _UPD_Altab(0, q->_Size, -q->_Size); /* heap=alloc+free */ 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _OK_Altab(&_Aldata); 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ((char *)q + CELL_OFF); 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _STD_END 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* free function */ 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _STD_BEGIN 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void(PortFree)(void *ptr) 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* free an allocated data object */ 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project register _Cell *q; 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project register psize_t size; 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int binNum; 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int binIndex; 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int qNextBin; 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int qNextNextBin; 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static int portFreeCount = 0; 4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project portFreeCount++; 4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(pmallocInitted); 4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _OK_Altab(&_Aldata); 4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ptr == 0) 4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q = (_Cell *)((char *)ptr - CELL_OFF); 4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size = q->_Size; 4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP 4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binNum = GET_MEM_BIN(q); 4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (size < SIZE_CELL || (size & M_MASK) != 0) 4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; /* erroneous call, bad count */ 4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (_Aldata._Head == 0 4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project || _PTR_NORM(q) < _PTR_NORM(_Aldata._Head)) 4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* insert at head of list */ 4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q->_Next = _Aldata._Head; 4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Aldata._Head = q; 4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP 4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* always the start of a bin */ 4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binsFirstFreeCell[binNum] = q; 4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* scan for insertion point */ 4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project register _Cell *qp = _Aldata._Head; 4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project register char *qpp; 4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project register _Cell *nextCell; 4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if !defined SPEEDUP || defined SPEEDUP_COMPARE 4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Cell *savedQp; 4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* this search loop is where all the time is spent */ 4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while ((nextCell = qp->_Next) != 0 4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project && _PTR_NORM(nextCell) < _PTR_NORM(q)) 4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp = qp->_Next; 4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project savedQp = qp; 4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP 4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* this is where the SPEEDUP code is sped up : start with the bin's first free cell */ 4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Cell *firstFreeInBin = binsFirstFreeCell[binNum]; 4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((firstFreeInBin != 0) && (q > firstFreeInBin)) 4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp = firstFreeInBin; 4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while ((nextCell = qp->_Next) != 0 4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project && _PTR_NORM(nextCell) < _PTR_NORM(q)) 4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp = qp->_Next; 4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* go back to the previous non-zero bin */ 5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp = NULL; /* for diagnostics */ 5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (binIndex = binNum; binIndex >= 0; binIndex--) 5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((binsFirstFreeCell[binIndex] != 0) && (q > binsFirstFreeCell[binIndex])) 5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp = binsFirstFreeCell[binIndex]; 5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* this code for diagnostic purposes to see how often it happens. otherwise, 5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * qp could have been set to _Aldata._Head prior to the binIndex loop above. 5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (qp == NULL) 5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp = _Aldata._Head; 5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* find the free cell location */ 5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while ((nextCell = qp->_Next) != 0 5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project && _PTR_NORM(nextCell) < _PTR_NORM(q)) 5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp = qp->_Next; 5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP_COMPARE 5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (qp != savedQp) 5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf("oops \n"); 5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP_COMPARE */ 5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if !defined SPEEDUP || defined SPEEDUP_COMPARE 5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp = savedQp; 5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qpp = (char *)qp + qp->_Size; 5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (_PTR_NORM((char *)q) < _PTR_NORM(qpp)) 5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; /* erroneous call, overlaps qp */ 5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (_PTR_NORM(qpp) == _PTR_NORM((char *)q)) 5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* merge qp and q (merge with prior cell) */ 5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* nothing to do to bin's free list here */ 5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp->_Size += q->_Size; 5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q = qp; 5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (qp->_Next != 0 && _PTR_NORM((char *)qp->_Next) 5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project < _PTR_NORM((char *)q + q->_Size)) 5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; /* erroneous call, overlaps qp->_Next */ 5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* splice q after qp */ 5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP 5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* add 1 entry here - this could change first entry in q's bin */ 5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Cell *firstFree = binsFirstFreeCell[binNum]; 5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((firstFree == 0) || (q < firstFree)) 5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binsFirstFreeCell[binNum] = q; 5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q->_Next = qp->_Next; 5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qp->_Next = q; 5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (q->_Next != 0 && _PTR_NORM((char *)q + q->_Size) 5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project == _PTR_NORM((char *)q->_Next)) 5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* merge q and q->_Next (merge with latter cell) */ 5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SPEEDUP 5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* lose 1 cell here - this could change first entry in bin. 5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * if q->_Next was first in bin, now it's its Next. 5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * careful : watch for next being in a different bin. 5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qNextBin = GET_MEM_BIN(q->_Next); 5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (binsFirstFreeCell[qNextBin] == q->_Next) 5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* The q->_Next cell is the first free cell in its bin; set the first free cell 5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pointer to NULL for now; if there is another free cell in the same bin then 5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project the first free cell pointer will be updated in next 'if' code block */ 5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binsFirstFreeCell[qNextBin] = 0; 5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* If there is another free cell after q->_Next and it's in the same bin then 5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project update the first free cell pointer if necessary */ 5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (0 != (q->_Next->_Next)) 5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project qNextNextBin = GET_MEM_BIN(q->_Next->_Next); 5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* The first free cell pointer for q->_Next->_Next's bin can only be set to 0 5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project by the code above; if it is 0 then q->_Next->_Next must be the first free 5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cell in the bin */ 5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (0 == binsFirstFreeCell[qNextNextBin]) 5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project binsFirstFreeCell[qNextNextBin] = q->_Next->_Next; 5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* SPEEDUP */ 5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _Aldata._Plast = 0; /* deoptimize for safety */ 5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q->_Size += q->_Next->_Size; 5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project q->_Next = q->_Next->_Next; 5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _UPD_Altab(0, -size, size); /* heap=alloc+free */ 5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _OK_Altab(&_Aldata); 6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* every successful free "falls off" here */ 6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project _STD_END 6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef __cplusplus 6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} /* end extern "C" */ 6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PORTABLE_DINKUM_MEM_MGR */ 6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 611