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