object_heap.c revision 7e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 27e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Copyright (c) 2007 Intel Corporation. All Rights Reserved. 37e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Permission is hereby granted, free of charge, to any person obtaining a 57e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * copy of this software and associated documentation files (the 67e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "Software"), to deal in the Software without restriction, including 77e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * without limitation the rights to use, copy, modify, merge, publish, 87e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * distribute, sub license, and/or sell copies of the Software, and to 97e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * permit persons to whom the Software is furnished to do so, subject to 107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * the following conditions: 117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The above copyright notice and this permission notice (including the 137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * next paragraph) shall be included in all copies or substantial portions 147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * of the Software. 157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "object_heap.h" 267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h> 297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LAST_FREE -1 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define ALLOCATED -2 347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SUSPENDED -3 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Expands the heap 387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Return 0 on success, -1 on error 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int object_heap_expand( object_heap_p heap ) 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int malloc_error = FALSE; 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_base_p *new_heap_index; 457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int next_free; 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int new_heap_size = heap->heap_size + heap->heap_increment; 477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_heap_index = (object_base_p *) realloc( heap->heap_index, new_heap_size * sizeof(object_base_p) ); 497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ( NULL == new_heap_index ) 507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -1; /* Out of memory */ 527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->heap_index = new_heap_index; 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang next_free = heap->next_free; 557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for(i = new_heap_size; i-- > heap->heap_size; ) 567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_base_p obj = (object_base_p) malloc(heap->object_size); 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->heap_index[i] = obj; 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == obj) 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang malloc_error = TRUE; 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang continue; /* Clean up after the loop is completely done */ 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj->id = i + heap->id_offset; 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj->next_free = next_free; 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang next_free = i; 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (malloc_error) 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Clean up the mess */ 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for(i = new_heap_size; i-- > heap->heap_size; ) 737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (heap->heap_index[i]) 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(heap->heap_index[i]); 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* heap->heap_index is left as is */ 807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -1; /* Out of memory */ 817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->next_free = next_free; 837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->heap_size = new_heap_size; 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; /* Success */ 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Return 0 on success, -1 on error 897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint object_heap_init( object_heap_p heap, int object_size, int id_offset) 917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->object_size = object_size; 937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->id_offset = id_offset & OBJECT_HEAP_OFFSET_MASK; 947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->heap_size = 0; 957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->heap_increment = 16; 967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->heap_index = NULL; 977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->next_free = LAST_FREE; 987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return object_heap_expand(heap); 997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Allocates an object 1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns the object ID on success, returns -1 on error 1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint object_heap_allocate( object_heap_p heap ) 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_base_p obj; 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ( LAST_FREE == heap->next_free ) 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if( -1 == object_heap_expand( heap ) ) 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -1; /* Out of memory */ 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( heap->next_free >= 0 ); 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj = heap->heap_index[heap->next_free]; 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->next_free = obj->next_free; 1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj->next_free = ALLOCATED; 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return obj->id; 1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Lookup an object by object ID 1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a pointer to the object on success, returns NULL on error 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangobject_base_p object_heap_lookup( object_heap_p heap, int id ) 1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_base_p obj; 1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ( (id < heap->id_offset) || (id > (heap->heap_size+heap->id_offset)) ) 1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang id &= OBJECT_HEAP_ID_MASK; 1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj = heap->heap_index[id]; 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Check if the object has in fact been allocated */ 1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ( obj->next_free != ALLOCATED ) 1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return obj; 1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Iterate over all objects in the heap. 1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a pointer to the first object on the heap, returns NULL if heap is empty. 1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangobject_base_p object_heap_first( object_heap_p heap, object_heap_iterator *iter ) 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *iter = -1; 1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return object_heap_next( heap, iter ); 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Iterate over all objects in the heap. 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a pointer to the next object on the heap, returns NULL if heap is empty. 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangobject_base_p object_heap_next( object_heap_p heap, object_heap_iterator *iter ) 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_base_p obj; 1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i = *iter + 1; 1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while ( i < heap->heap_size) 1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj = heap->heap_index[i]; 1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ( (obj->next_free == ALLOCATED) || (obj->next_free == SUSPENDED) ) 1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *iter = i; 1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return obj; 1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang i++; 1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *iter = i; 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Frees an object 1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid object_heap_free( object_heap_p heap, object_base_p obj ) 1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Don't complain about NULL pointers */ 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL != obj) 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Check if the object has in fact been allocated */ 1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(( obj->next_free == ALLOCATED ) || ( obj->next_free == SUSPENDED )); 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj->next_free = heap->next_free; 1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->next_free = obj->id & OBJECT_HEAP_ID_MASK; 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroys a heap, the heap must be empty. 1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid object_heap_destroy( object_heap_p heap ) 1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_base_p obj; 2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < heap->heap_size; i++) 2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Check if object is not still allocated */ 2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj = heap->heap_index[i]; 2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( obj->next_free != ALLOCATED ); 2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( obj->next_free != SUSPENDED ); 2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Free object itself */ 2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free( obj ); 2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(heap->heap_index); 2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->heap_size = 0; 2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->heap_index = NULL; 2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang heap->next_free = LAST_FREE; 2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Suspend an object 2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Suspended objects can not be looked up 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid object_heap_suspend_object( object_base_p obj, int suspend) 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (suspend) 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( obj->next_free == ALLOCATED ); 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj->next_free = SUSPENDED; 2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( obj->next_free == SUSPENDED ); 2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj->next_free = ALLOCATED; 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 234