14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * pmemory.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#include "passert.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pcrc.h" 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PFileSystem.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PStackTrace.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h" 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory_ext.h" 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmutex.h" 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef USE_STDLIB_MALLOC 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 Projectstatic unsigned int gNbInit = 0; 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PFile* gFile = NULL; 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_BOOL isLogEnabled = ESR_TRUE; 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic asr_uint32_t gMaxAlloc = -1; 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic asr_uint32_t gCurAlloc = -1; 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic size_t gMemPoolSize = (3*1024*1024); /* default value: 3M */ 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic MUTEX memMutex; 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_MEM_TAG 256 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Only PMEM_MAP_TRACE has been defined, could do other memory logging/debugging */ 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PMEM_STACKTRACE 0 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* If enabled, logs individual memory allocation, reallocation, free operations */ 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PMEM_LOG_LOWLEVEL 0 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#elif defined(WIN32) 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#pragma message("No PMEM_MAP_TRACE") 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef struct MemoryData_t 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int index; 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t size; 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /** 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Stacktrace of where the memory was allocated from. 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const LCHAR* stackTrace; 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /** 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Pointer to next memory allocation associated with the same tag. 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project struct MemoryData_t* next; 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /** 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Pointer to last memory allocation associated with the same tag. 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project struct MemoryData_t* last; 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectMemoryData; 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef struct MemMapEntry_t 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /** 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Memory tag/ID associated with allocation. 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const LCHAR* tag; 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project asr_uint32_t curAlloc; 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project asr_uint32_t maxAlloc; 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unsigned int crc; 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /** 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * First memory allocation associated with this tag. 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Memory that has been deallocated will not show up on this list. 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* first; 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /** 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Last memory allocation associated with this tag. 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Memory that has been deallocated will not show up on this list. 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* last; 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectMemMapEntry; 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic MemMapEntry gMemoryMap[MAX_MEM_TAG]; 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectextern ESR_ReturnCode memory_pool_creation_status; /* Verify that memory pool actually was created */ 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define malloc PortNew 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define free PortDelete 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode getStackTrace(LCHAR* stackTrace, size_t* len) 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL isInit; 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PStackTraceIsInitialized(&isInit); 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_SUCCESS && isInit) 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR* index; 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t bufferLen = *len; 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i; 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PStackTraceGetValue(stackTrace, &bufferLen); 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_SUCCESS) 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < 2; ++i) 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PStackTracePopLevel(stackTrace); 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, "[%s:%d] PStackTracePopLevel failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc)); 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project index = stackTrace; 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (index) 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project index = LSTRSTR(index, L(" at\n")); 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (index != NULL) 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *(index + 3) = L(' '); 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc == ESR_NOT_SUPPORTED) 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(stackTrace, L("")); 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc != ESR_SUCCESS) 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, "[%s:%d] PStackTraceGetValue failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc)); 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(stackTrace, L("(null)")); 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *len = LSTRLEN(stackTrace); 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_STACKTRACE */ 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int getIndex(const LCHAR *key) 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unsigned int crc = ~pcrcComputeString(key); 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int initialIdx = (int)(crc % MAX_MEM_TAG); 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int idx = initialIdx; 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (;;) 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gMemoryMap[idx].tag == NULL) 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* found an empty slot, use it. */ 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMemoryMap[idx].tag = key; 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMemoryMap[idx].curAlloc = 0; 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMemoryMap[idx].maxAlloc = 0; 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMemoryMap[idx].crc = crc; 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMemoryMap[idx].first = NULL; 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMemoryMap[idx].last = NULL; 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_LOG_LOWLEVEL 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gFile != NULL) 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|newtag|%s|%d|\n"), key, idx); 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return idx; 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gMemoryMap[idx].crc == crc && 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCMP(gMemoryMap[idx].tag, key) == 0) 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* found a matching slot, return it */ 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return idx; 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (++idx == MAX_MEM_TAG) 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Look at next slot and wrap around. */ 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project idx = 0; 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (idx == initialIdx) 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Not thread-safe. But do not expect user calls this function on different threads simultaneously */ 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PMemorySetPoolSize(size_t size) 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit > 0) 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMemPoolSize = size; 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_NOT_SUPPORTED; 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PMemoryGetPoolSize(size_t *size) 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *size = gMemPoolSize; 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_NOT_SUPPORTED; 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* it is not thread safe: hard to protect the createMutex() 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * could fix it by using static mutex initialization in some OS, 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * but does not work with our own pthread implementation for vxworks 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * SUPPOSE the user just calls this function once 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PMemInit(void) 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode init_status; 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit > 0) 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project init_status = createMutex(&memMutex, ESR_FALSE); 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (init_status == ESR_SUCCESS) 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ++gNbInit; 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memset(gMemoryMap, 0, sizeof(gMemoryMap)); 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PortMemSetPoolSize(gMemPoolSize); 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PortMemoryInit(); 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* There is no friggin' way to pass the status of the memory initialization, because of the damn macros and all the other crap */ 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* So I am checking the value of an external variable, this sucks, but I can't ignore something this important */ 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (memory_pool_creation_status == ESR_SUCCESS) 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Reset this because with all the layers of crap, I can't guarantee we'll get to the bottom layer on a re-init */ 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memory_pool_creation_status = ESR_FATAL_ERROR; 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("ESR_INVALID_STATE: Memory Pool Could Not Be Created\n")); 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PortMemoryTerm(); 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project deleteMutex(&memMutex); 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project init_status = ESR_INVALID_STATE; 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project deleteMutex(&memMutex); 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Initialize global static variables 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gCurAlloc = 0; 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMaxAlloc = 0; 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (init_status); 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* it is not thread safe: hard to protect the deleteMutex() 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * could fix it by using static mutex initialization in some OS, 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * but does not work with our own pthread implementation for vxworks 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * SUPPOSE the user just calls this function once 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PMemShutdown(void) 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i; 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit == 0) 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit == 1) 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_MEM_TAG; ++i) 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project free((LCHAR*) gMemoryMap[i].tag); 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMemoryMap[i].tag = NULL; 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PortMemoryTerm(); 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project deleteMutex(&memMutex); 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gNbInit--; 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PMemSetLogFile(PFile* file) 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit == 0) 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lockMutex(&memMutex); 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gFile = file; 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PMemDumpLogFile(void) 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit == 0) 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lockMutex(&memMutex); 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gFile != NULL) 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Hide gFile from memory report */ 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* CHK(rc, gFile->hideMemoryAllocation(gFile));*/ 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PMemReport(gFile); 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__); 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gFile != PSTDIN && gFile != PSTDOUT && gFile != PSTDERR) 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* rc = gFile->destroy(gFile); 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__); 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }*/ 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfclose ( gFile ); 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gFile = NULL; 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PMemSetLogEnabled(ESR_BOOL value) 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lockMutex(&memMutex); 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project isLogEnabled = value; 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PMemLogFree(void* ptr) 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* data; 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemMapEntry* e; 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE && PMEM_LOG_LOWLEVEL 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ptr == NULL || gNbInit == 0) 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lockMutex(&memMutex); 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data = (MemoryData*)(((unsigned char*) ptr) - sizeof(MemoryData)); 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e = gMemoryMap + data->index; 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(data->index >= 0 && data->index <= MAX_MEM_TAG); 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isLogEnabled) 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(e->curAlloc >= data->size); 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->curAlloc -= data->size; 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(gCurAlloc >= data->size); 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gCurAlloc -= data->size; 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->size = 0; 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->first != NULL && e->first == data) 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->first = data->next; 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->last != NULL && e->last == data) 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->last = data->last; 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data->last != NULL) 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->last->next = data->next; 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data->next != NULL) 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->next->last = data->last; 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->next = NULL; 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->last = NULL; 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_LOG_LOWLEVEL 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gFile != NULL && isLogEnabled) 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR stackTrace[P_MAX_STACKTRACE]; 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t len = P_MAX_STACKTRACE; 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = getStackTrace(stackTrace, &len); 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, "[%s:%d] getStackTrace failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc)); 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|free|%s|%s|%d|0x%x|%s|\n"), e->tag, data->stackTrace, data->size, ptr, stackTrace); 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|free|%s|%d|0x%x\n"), e->tag, data->size, ptr); 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_STACKTRACE */ 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_LOG_LOWLEVEL */ 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_MAP_TRACE */ 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE && PMEM_LOG_LOWLEVEL 4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PMemReport(PFile* file) 4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define TAG_SIZE 52 4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project asr_uint32_t totalAlloc = 0; 4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i; 4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemMapEntry* e; 4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unsigned int crc; 4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR truncatedTag[TAG_SIZE]; 4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t len; 4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR TAG_PREFIX[] = L("..."); 4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const size_t TAG_PREFIX_SIZE = LSTRLEN(TAG_PREFIX); 4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const size_t countToCopy = (TAG_SIZE - 1) - TAG_PREFIX_SIZE; 4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* data; 4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit == 0) 4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (file == NULL) 4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project file = gFile; 4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (file == NULL) 4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lockMutex(&memMutex); 4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gFile != NULL) 4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0, e = gMemoryMap; i < MAX_MEM_TAG; ++i, ++e) 4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->tag == NULL) 4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project continue; 4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project crc = ~pcrcComputeString(e->tag); 4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (crc != e->crc) 4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|-|0|corrupt|%d|\n"), i); 4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(file, L("%-52s %10s %15s\n"), L("Memory tag"), L("Cur. Alloc"), L("Max. Alloc")); 5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0, e = gMemoryMap; i < MAX_MEM_TAG; ++i, ++e) 5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->tag == NULL) 5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project continue; 5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project crc = ~pcrcComputeString(e->tag); 5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (crc != e->crc) 5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(file, L("**********%04d********** %38u %15u\n"), i, e->curAlloc, e->maxAlloc); 5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project len = LSTRLEN(e->tag); 5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (len > TAG_SIZE - 1) 5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(truncatedTag, TAG_PREFIX); 5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(truncatedTag + TAG_PREFIX_SIZE, e->tag + (len - countToCopy)); 5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(LSTRLEN(truncatedTag) == TAG_SIZE - 1); 5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(truncatedTag, e->tag); 5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(file, L("%-52s %10u %15u\n"), truncatedTag, e->curAlloc, e->maxAlloc); 5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data = gMemoryMap[i].first; 5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (data) 5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data->size != 0 && data->stackTrace != NULL) 5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR stackTrace[P_MAX_STACKTRACE]; 5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR* index; 5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(stackTrace, data->stackTrace); 5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project index = stackTrace; 5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (index) 5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project index = LSTRSTR(index, L(" at ")); 5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (index != NULL) 5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *(index + 3) = L('\n'); 5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(file, L("StackTrace:\n%s\n\n"), stackTrace); 5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data = data->next; 5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(e->curAlloc >= 0); 5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project totalAlloc += e->curAlloc; 5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(file, L("%-52s %10u %15u\n"), L("Total"), totalAlloc, gMaxAlloc); 5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(totalAlloc == gCurAlloc); 5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* not support */ 5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_MAP_TRACE */ 5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* 5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectDESCRIPTION 5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project The functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional. This volume of IEEE Std 1003.1-2001 defers to the ISO C standard. 5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectThe malloc() function shall allocate unused space for an object whose size in bytes is specified by size and whose value is unspecified. 5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectThe order and contiguity of storage allocated by successive calls to malloc() is unspecified. The pointer returned if the allocation succeeds shall be suitably aligned so that it may be assigned to a pointer to any type of object and then used to access such an object in the space allocated (until the space is explicitly freed or reallocated). Each such allocation shall yield a pointer to an object disjoint from any other object. The pointer returned points to the start (lowest byte address) of the allocated space. If the space cannot be allocated, a null pointer shall be returned. If the size of the space requested is 0, the behavior is implementation-defined: the value returned shall be either a null pointer or a unique pointer. 5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectRETURN VALUE 5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectUpon successful completion with size not equal to 0, malloc() shall return a pointer to the allocated space. If size is 0, either a null pointer or a unique pointer that can be successfully passed to free() shall be returned. Otherwise, it shall return a null pointer and set errno to indicate the error. 5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/ 5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *pmalloc(size_t nbBytes, const LCHAR* tag, const LCHAR* file, int line) 5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *pmalloc(size_t nbBytes) 5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* data; 5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void* result = NULL; 5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t actualSize; 5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int idx; 5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemMapEntry* e; 5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t stackTraceSize = P_MAX_STACKTRACE; 5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR* stackTrace; 5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL isInit; 5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit == 0) 5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return NULL; 5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lockMutex(&memMutex); 5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (tag == NULL) 5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project tag = file; 5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(tag != NULL); 5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project idx = getIndex(tag); 5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (idx == -1) 5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("ESR_INVALID_STATE: pmalloc() ran out of slots")); 6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gMemoryMap[idx].tag == tag) 6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* This is a new key, allocate memory for it */ 6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMemoryMap[idx].tag = malloc(sizeof(LCHAR) * (LSTRLEN(tag) + 1)); 6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gMemoryMap[idx].tag == NULL) 6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY((LCHAR*) gMemoryMap[idx].tag, tag); 6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project actualSize = sizeof(MemoryData) + nbBytes; 6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data = (MemoryData *) malloc(actualSize); 6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data == NULL) 6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * printf("no space when alloc %d from file %s line %d\nmem usage: %d\n", 6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * nbBytes, file, line, PortMallocGetMaxMemUsed()); 6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->index = idx; 6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PStackTraceIsInitialized(&isInit); 6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isInit) 6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project stackTrace = malloc(sizeof(LCHAR) * (stackTraceSize + 1)); 6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (stackTrace == NULL) 6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = getStackTrace(stackTrace, &stackTraceSize); 6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Shrink stackTrace buffer */ 6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(LSTRLEN(stackTrace) < P_MAX_STACKTRACE); 6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->stackTrace = realloc(stackTrace, sizeof(LCHAR) * (LSTRLEN(stackTrace) + 1)); 6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data->stackTrace == NULL) 6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project free(stackTrace); 6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->stackTrace = NULL; 6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e = gMemoryMap + idx; 6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->last != NULL) 6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->last->next = data; 6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->last = e->last; 6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->next = NULL; 6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->last = data; 6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->first == NULL) 6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->first = data; 6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isLogEnabled) 6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->size = actualSize; 6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->curAlloc += actualSize; 6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->maxAlloc < e->curAlloc) 6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->maxAlloc = e->curAlloc; 6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gCurAlloc += actualSize; 6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gMaxAlloc < gCurAlloc) 6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMaxAlloc = gCurAlloc; 6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->size = 0; 6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result = (void*)(data + 1); 6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_LOG_LOWLEVEL 6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gFile != NULL && isLogEnabled) 6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gFile != NULL) 6864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 6884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|alloc|%s|%d|0x%x|%s|\n"), tag, actualSize, result, data->stackTrace); 6894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 6904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|alloc|%s|%d|0x%x|\n"), tag, actualSize, result); 6914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_STACKTRACE */ 6924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_LOG_LOWLEVEL */ 6944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 6964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 6974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return result; 6984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 7014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *pcalloc(size_t nbItems, size_t itemSize, const LCHAR* tag, const LCHAR* file, int line) 7024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 7034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *pcalloc(size_t nbItems, size_t itemSize) 7044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 7054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 7064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void* result = NULL; 7074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit == 1) 7094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 7114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result = (MemoryData *)pmalloc(nbItems * itemSize, tag, file, line); 7124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 7134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result = (MemoryData *)pmalloc(nbItems * itemSize); 7144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 7154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (result != NULL) 7164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memset(result, 0, nbItems * itemSize); 7174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (result); 7194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 7204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* 7224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectDESCRIPTION 7234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectThe realloc() function changes the size of the memory object pointed to by ptr to the size specified by size. The contents of the object will remain unchanged up to the lesser of the new and old sizes. If the new size of the memory object would require movement of the object, the space for the previous instantiation of the object is freed. If the new size is larger, the contents of the newly allocated portion of the object are unspecified. If size is 0 and ptr is not a null pointer, the object pointed to is freed. If the space cannot be allocated, the object remains unchanged. 7244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectIf ptr is a null pointer, realloc() behaves like malloc() for the specified size. 7254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectIf ptr does not match a pointer returned earlier by calloc(), malloc() or realloc() or if the space has previously been deallocated by a call to free() or realloc(), the behaviour is undefined. 7274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectThe order and contiguity of storage allocated by successive calls to realloc() is unspecified. The pointer returned if the allocation succeeds is suitably aligned so that it may be assigned to a pointer to any type of object and then used to access such an object in the space allocated (until the space is explicitly freed or reallocated). Each such allocation will yield a pointer to an object disjoint from any other object. The pointer returned points to the start (lowest byte address) of the allocated space. If the space cannot be allocated, a null pointer is returned. 7294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RETURN VALUE 7314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectUpon successful completion with a size not equal to 0, realloc() returns a pointer to the (possibly moved) allocated space. If size is 0, either a null pointer or a unique pointer that can be successfully passed to free() is returned. If there is not enough available memory, realloc() returns a null pointer 7324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/ 7334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 7344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *prealloc(void *ptr, size_t newSize, const LCHAR *file, int line) 7354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 7364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *prealloc(void *ptr, size_t newSize) 7374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 7384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 7394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* oldData; 7404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* newData; 7414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *result = NULL; 7424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t actualSize; 7434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 7444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemMapEntry* e; 7454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 7464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t oldSize; 7474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 7484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const LCHAR* oldStackTrace; 7494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* oldNext; 7504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* oldLast; 7514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 7524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL bMalloc = ESR_FALSE; 7534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gNbInit == 0) 7554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return NULL; 7564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (newSize == 0 && ptr != NULL) 7584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 7604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfree(ptr, file, line); 7614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 7624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfree(ptr); 7634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 7644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return NULL; 7654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (ptr == NULL) 7674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 7694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return pmalloc(newSize, NULL, file, line); 7704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 7714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return pmalloc(newSize); 7724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 7734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lockMutex(&memMutex); 7764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project oldData = (MemoryData *)(((unsigned char *) ptr) - sizeof(MemoryData)); 7784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project oldSize = oldData->size; 7794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(oldSize >= 0); 7804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 7814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project oldStackTrace = oldData->stackTrace; 7824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project oldNext = oldData->next; 7834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project oldLast = oldData->last; 7844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 7854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 7864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e = gMemoryMap + oldData->index; 7874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 7884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project actualSize = newSize + sizeof(MemoryData); 7904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (oldSize != actualSize) 7914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(PORTABLE_DINKUM_MEM_MGR) || defined(PORTABLE_FIXED_SIZE_MEM_BLOCK_SCHEME) 7934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newData = (MemoryData *) PortNew(actualSize); 7944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (newData == NULL) 7954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("OUT_OF_MEMORY: prealloc() failed at %s:%d"), __FILE__, __LINE__); 7974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return NULL; 7984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bMalloc = ESR_TRUE; 8004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (oldSize >= actualSize) 8014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 8024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memcpy(newData, oldData, actualSize); 8034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 8054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 8064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memcpy(newData, oldData, oldSize); 8074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PortDelete(oldData); 8094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 8104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newData = (MemoryData *) realloc(oldData, actualSize); 8114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bMalloc = ESR_TRUE; 8124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 8134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else /* No change */ 8154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 8164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newData = oldData; 8174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 8204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (newData != NULL && bMalloc) 8214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 8224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isLogEnabled) 8234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 8244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->curAlloc += actualSize - oldSize; 8254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->maxAlloc < e->curAlloc) 8264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->maxAlloc = e->curAlloc; 8274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gCurAlloc += actualSize - oldSize; 8294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gMaxAlloc < gCurAlloc) 8304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gMaxAlloc = gCurAlloc; 8314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 8344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newData->stackTrace = oldStackTrace; 8354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newData->next = oldNext; 8364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newData->last = oldLast; 8374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (newData->last != NULL) 8384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newData->last->next = newData; 8394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (newData->next != NULL) 8404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newData->next->last = newData; 8414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->first == oldData) 8424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->first = newData; 8434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->last == oldData) 8444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->last = newData; 8454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 8464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 8484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (newData != NULL) 8504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 8514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newData->size = actualSize; 8524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result = (void*)(newData + 1); 8534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_LOG_LOWLEVEL 8564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gFile != NULL && isLogEnabled) 8574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 8584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 8594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR stackTrace[P_MAX_STACKTRACE]; 8604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t len = P_MAX_STACKTRACE; 8614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 8624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = getStackTrace(stackTrace, &len); 8644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 8654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 8664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, "[%s:%d] getStackTrace failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc)); 8674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 8684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|%s|%d|realloc|%d|0x%x|%s|\n"), e->tag, oldSize, actualSize, ptr, stackTrace); 8704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 8714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|%s|%d|realloc|%d|0x%x|\n"), e->tag, oldSize, actualSize, ptr); 8724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_STACKTRACE */ 8734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_LOG_LOWLEVEL */ 8754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 8774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return result; 8784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE && PMEM_LOG_LOWLEVEL 8794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 8804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 8814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return NULL; 8824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 8834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 8844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 8864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid pfree(void* ptr, const LCHAR* file, int line) 8874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 8884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid pfree(void* ptr) 8894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 8904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 8914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemoryData* data; 8924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 8934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MemMapEntry* e; 8944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 8954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ptr == NULL || gNbInit == 0) 8964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 8974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lockMutex(&memMutex); 8994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 9004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data = (MemoryData*)(((unsigned char*) ptr) - sizeof(MemoryData)); 9014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef PMEM_MAP_TRACE 9024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(data->index >= 0 && data->index <= MAX_MEM_TAG); 9034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e = gMemoryMap + data->index; 9044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isLogEnabled) 9054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 9064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(e->curAlloc >= data->size); 9074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->curAlloc -= data->size; 9084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 9094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(gCurAlloc >= data->size); 9104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gCurAlloc -= data->size; 9114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 9124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 9134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->first != NULL && e->first == data) 9144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->first = data->next; 9154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->last != NULL && e->last == data) 9164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project e->last = data->last; 9174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data->last != NULL) 9184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->last->next = data->next; 9194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data->next != NULL) 9204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 9214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->next->last = data->last; 9224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->next = NULL; 9234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 9244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->last = NULL; 9254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_STACKTRACE */ 9264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_LOG_LOWLEVEL 9274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (gFile != NULL && isLogEnabled) 9284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 9294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 9304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR stackTrace[P_MAX_STACKTRACE]; 9314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t len = P_MAX_STACKTRACE; 9324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 9334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 9344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = getStackTrace(stackTrace, &len); 9354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 9364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 9374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, "[%s:%d] getStackTrace failed with %s\n", __FILE__, __LINE__, ESR_rc2str(rc)); 9384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 9394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 9404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|free|%s|%s|%d|0x%x|%s|\n"), e->tag, data->stackTrace, data->size, ptr, stackTrace); 9414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 9424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(gFile, L("pmem|free|%s|%d|0x%x\n"), e->tag, data->size, ptr); 9434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_STACKTRACE */ 9444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 9454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_LOG_LOWLEVEL */ 9464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE 9474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project free((LCHAR*) data->stackTrace); 9484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->stackTrace = NULL; 9494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* PMEM_STACKTRACE */ 9504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 9514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 9524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project free(data); 9534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 9544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PMEM_STACKTRACE && PMEM_LOG_LOWLEVEL 9554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 9564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unlockMutex(&memMutex); 9574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 9584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 9594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 9604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 9614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 9624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 963