17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
37e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
4f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a
5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the
6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including
7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish,
8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to
9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to
10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions:
113f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
12f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the
13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions
14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software.
153f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
16f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
24bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Waldo Bastian <waldo.bastian@intel.com>
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "object_heap.h"
307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h>
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
35c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LAST_FREE    -1
387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define ALLOCATED    -2
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SUSPENDED    -3
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Expands the heap
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Return 0 on success, -1 on error
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
45dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic int object_heap_expand(object_heap_p heap)
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int malloc_error = FALSE;
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_base_p *new_heap_index;
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int next_free;
517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int new_heap_size = heap->heap_size + heap->heap_increment;
52dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
53dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    new_heap_index = (object_base_p *) realloc(heap->heap_index, new_heap_size * sizeof(object_base_p));
54dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == new_heap_index) {
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -1; /* Out of memory */
567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->heap_index = new_heap_index;
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    next_free = heap->next_free;
59dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = new_heap_size; i-- > heap->heap_size;) {
602befccec034c13d34746a9e87149889d59ac767bFei Jiang        object_base_p obj = (object_base_p) calloc(1, heap->object_size);
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        heap->heap_index[i] = obj;
62dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == obj) {
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            malloc_error = TRUE;
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            continue; /* Clean up after the loop is completely done */
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj->id = i + heap->id_offset;
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj->next_free = next_free;
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        next_free = i;
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (malloc_error) {
727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Clean up the mess */
73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        for (i = new_heap_size; i-- > heap->heap_size;) {
74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (heap->heap_index[i]) {
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                free(heap->heap_index[i]);
767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* heap->heap_index is left as is */
797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -1; /* Out of memory */
807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->next_free = next_free;
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->heap_size = new_heap_size;
837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0; /* Success */
847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Return 0 on success, -1 on error
887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint object_heap_init(object_heap_p heap, int object_size, int id_offset)
907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->object_size = object_size;
927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->id_offset = id_offset & OBJECT_HEAP_OFFSET_MASK;
937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->heap_size = 0;
947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->heap_increment = 16;
957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->heap_index = NULL;
967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->next_free = LAST_FREE;
977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return object_heap_expand(heap);
987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Allocates an object
1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns the object ID on success, returns -1 on error
1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint object_heap_allocate(object_heap_p heap)
1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_base_p obj;
107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (LAST_FREE == heap->next_free) {
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (-1 == object_heap_expand(heap)) {
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return -1; /* Out of memory */
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(heap->next_free >= 0);
113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj = heap->heap_index[heap->next_free];
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->next_free = obj->next_free;
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj->next_free = ALLOCATED;
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return obj->id;
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Lookup an object by object ID
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a pointer to the object on success, returns NULL on error
1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunobject_base_p object_heap_lookup(object_heap_p heap, int id)
1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_base_p obj;
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((id < heap->id_offset) || (id > (heap->heap_size + heap->id_offset))) {
1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return NULL;
1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    id &= OBJECT_HEAP_ID_MASK;
1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj = heap->heap_index[id];
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Check if the object has in fact been allocated */
1346d59fc131522963176a693a06cd706f041fd899aFei Jiang#if 0
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj->next_free != ALLOCATED) {
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return NULL;
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1386d59fc131522963176a693a06cd706f041fd899aFei Jiang#endif
1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return obj;
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Iterate over all objects in the heap.
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a pointer to the first object on the heap, returns NULL if heap is empty.
1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunobject_base_p object_heap_first(object_heap_p heap, object_heap_iterator *iter)
1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *iter = -1;
149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return object_heap_next(heap, iter);
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Iterate over all objects in the heap.
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a pointer to the next object on the heap, returns NULL if heap is empty.
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunobject_base_p object_heap_next(object_heap_p heap, object_heap_iterator *iter)
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_base_p obj;
1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i = *iter + 1;
160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (i < heap->heap_size) {
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj = heap->heap_index[i];
162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((obj->next_free == ALLOCATED) || (obj->next_free == SUSPENDED)) {
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            *iter = i;
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return obj;
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        i++;
1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *iter = i;
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return NULL;
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Frees an object
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid object_heap_free(object_heap_p heap, object_base_p obj)
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Don't complain about NULL pointers */
180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL != obj) {
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Check if the object has in fact been allocated */
182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT((obj->next_free == ALLOCATED) || (obj->next_free == SUSPENDED));
183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj->next_free = heap->next_free;
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        heap->next_free = obj->id & OBJECT_HEAP_ID_MASK;
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroys a heap, the heap must be empty.
1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid object_heap_destroy(object_heap_p heap)
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_base_p obj;
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < heap->heap_size; i++) {
1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Check if object is not still allocated */
1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj = heap->heap_index[i];
199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(obj->next_free != ALLOCATED);
200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(obj->next_free != SUSPENDED);
2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Free object itself */
202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(obj);
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(heap->heap_index);
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->heap_size = 0;
2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->heap_index = NULL;
2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    heap->next_free = LAST_FREE;
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Suspend an object
212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Suspended objects can not be looked up
2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid object_heap_suspend_object(object_base_p obj, int suspend)
2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (suspend) {
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(obj->next_free == ALLOCATED);
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj->next_free = SUSPENDED;
219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(obj->next_free == SUSPENDED);
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj->next_free = ALLOCATED;
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
224