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