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