17f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* 27f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 37f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 47f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * you may not use this file except in compliance with the License. 67f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * You may obtain a copy of the License at 77f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 87f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * See the License for the specific language governing permissions and 147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * limitations under the License. 157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */ 167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- includes ----------------------------------------------------------- */ 187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Functions.h" 207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/DynMemManager.h" 217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Context.h" 227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* minimum block size dynamically allocated in function nextBlock (affects only shared memory) */ 267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#define bbs_DYN_MEM_MIN_NEW_BLOCK_SIZE 0 277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** Offset to actual memory area on allocated memory blocks (in 16-bit words). 297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Value needs to be large enough to hold the pointer to the next memory block 307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * and the size value (32-bit) of the memory area. 317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */ 327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#define bbs_MEM_OFFSET 6 337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ auxiliary functions } ---------------------------------------- */ 377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */ 457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_DynMemManager_init( struct bbs_Context* cpA, 517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_DynMemManager* ptrA ) 527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->memPtrE = NULL; 547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->mallocFPtrE = NULL; 557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->freeFPtrE = NULL; 567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_DynMemManager_exit( struct bbs_Context* cpA, 617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_DynMemManager* ptrA ) 627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->memPtrE = NULL; 647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->mallocFPtrE = NULL; 657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->freeFPtrE = NULL; 667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */ 737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */ 817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbs_DynMemManager_allocatedSize( struct bbs_Context* cpA, 877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbs_DynMemManager* ptrA ) 887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 sizeL = 0; 907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* pL = ( uint16* )ptrA->memPtrE; 917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( pL != NULL ) 927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sizeL += ( ( uint32* )pL )[ 2 ]; 947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pL = *( uint16** )pL; 957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return sizeL; 977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */ 1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */ 1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */ 1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint16* bbs_DynMemManager_alloc( struct bbs_Context* cpA, 1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_DynMemManager* ptrA, 1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbs_MemSeg* memSegPtrA, 1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 sizeA ) 1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* pL = NULL; 1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_DEF_fNameL( "uint16* bbs_DynMemManager_alloc( struct bbs_DynMemManager* ptrA, uint32 sizeA )" ) 1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ptrA->mallocFPtrE == NULL ) 1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR1( "%s:\n Malloc handler not defined.\n", fNameL ); 1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return NULL; 1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ptrA->memPtrE == NULL ) 1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->memPtrE = ptrA->mallocFPtrE( cpA, memSegPtrA, ( sizeA + bbs_MEM_OFFSET ) << 1 ); 1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pL = ptrA->memPtrE; 1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16** ppL = ( uint16** )ptrA->memPtrE; 1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( *ppL != NULL ) ppL = ( uint16** )*ppL; 1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *ppL = ptrA->mallocFPtrE( cpA, memSegPtrA, ( sizeA + bbs_MEM_OFFSET ) << 1 ); 1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pL = *ppL; 1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( pL == NULL ) 1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERR1( bbs_ERR_OUT_OF_MEMORY, "%s:\n Allocation failed.\n", fNameL ); 1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return NULL; 1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ( ( uint32* )pL )[ 0 ] = 0; 1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ( ( uint32* )pL )[ 1 ] = 0; 1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ( ( uint32* )pL )[ 2 ] = sizeA + bbs_MEM_OFFSET; 1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return pL + bbs_MEM_OFFSET; 1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_DynMemManager_free( struct bbs_Context* cpA, 1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_DynMemManager* ptrA, 1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* memPtrA ) 1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_DEF_fNameL( "void bbs_DynMemManager_free( .... )" ) 1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ptrA->memPtrE == NULL ) 1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR1( "%s:\n Memory was not allocated.\n", fNameL ); 1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return; 1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else if( ptrA->memPtrE + bbs_MEM_OFFSET == memPtrA ) 1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* memPtrL = ptrA->memPtrE; 1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->memPtrE = *( uint16** )ptrA->memPtrE; 1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->freeFPtrE( memPtrL ); 1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* p0L = NULL; 1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* pL = ( uint16* )ptrA->memPtrE; 1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( pL != NULL ) 1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( pL + bbs_MEM_OFFSET == memPtrA ) break; 1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project p0L = pL; 1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pL = *( uint16** )pL; 1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( pL != NULL ) 1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ptrA->freeFPtrE == NULL ) 2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR1( "%s:\n Free handler not defined.\n", fNameL ); 2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return; 2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( p0L != NULL ) 2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *( uint16** )p0L = *( uint16** )pL; 2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->memPtrE = *( uint16** )pL; 2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->freeFPtrE( pL ); 2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR1( "%s:\n Attempt to free memory that was not allocated.\n", fNameL ); 2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return; 2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint16* bbs_DynMemManager_nextBlock( struct bbs_Context* cpA, 2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_DynMemManager* ptrA, 2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbs_MemSeg* memSegPtrA, 2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* curBlockPtrA, 2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 minSizeA, 2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32* actualSizePtrA ) 2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* pL = ( uint16* )ptrA->memPtrE; 2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_DEF_fNameL( "uint16* bbs_DynMemManager_nextBlock( .... )" ) 2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( curBlockPtrA != NULL ) 2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* find current block */ 2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( pL != NULL ) 2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( pL + bbs_MEM_OFFSET == curBlockPtrA ) break; 2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pL = *( uint16** )pL; 2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( pL == NULL ) 2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR1( "%s:\nCould not find current memory block.\n", fNameL ); 2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *actualSizePtrA = 0; 2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return NULL; 2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* go to next block */ 2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pL = *( uint16** )pL; 2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* find next fitting block */ 2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( pL != NULL ) 2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ( ( uint32* )pL )[ 2 ] >= minSizeA + bbs_MEM_OFFSET ) break; 2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pL = *( uint16** )pL; 2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( pL == NULL ) 2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* no proper block -> allocate new one */ 2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 blockSizeL = minSizeA > bbs_DYN_MEM_MIN_NEW_BLOCK_SIZE ? minSizeA : bbs_DYN_MEM_MIN_NEW_BLOCK_SIZE; 2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* memPtrL = bbs_DynMemManager_alloc( cpA, ptrA, memSegPtrA, blockSizeL ); 2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( memPtrL != NULL ) 2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *actualSizePtrA = blockSizeL; 2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *actualSizePtrA = 0; 2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return memPtrL; 2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *actualSizePtrA = ( ( uint32* )pL )[ 2 ] - bbs_MEM_OFFSET; 2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return pL + bbs_MEM_OFFSET; 2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_DynMemManager_freeAll( struct bbs_Context* cpA, struct bbs_DynMemManager* ptrA ) 2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16** ppL = ( uint16** )ptrA->memPtrE; 2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( ppL != NULL ) 2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* memPtrL = ( uint16* )ppL; 2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ppL = ( uint16** )*ppL; 2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->freeFPtrE( memPtrL ); 2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->memPtrE = NULL; 2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 302