qse/ase/stx/memory.c

103 lines
2.3 KiB
C
Raw Normal View History

2005-05-06 15:54:47 +00:00
/*
2005-05-06 16:07:58 +00:00
* $Id: memory.c,v 1.2 2005-05-06 16:07:58 bacon Exp $
2005-05-06 15:54:47 +00:00
*/
#include <xp/stx/memory.h>
#include <xp/bas/memory.h>
2005-05-06 16:07:58 +00:00
#include <xp/bas/assert.h>
2005-05-06 15:54:47 +00:00
xp_stx_memory_t* xp_stx_memory_open (
xp_stx_memory_t* mem, xp_stx_word_t capacity)
{
xp_stx_object_t** slots;
2005-05-06 16:07:58 +00:00
xp_assert (capacity > 0);
2005-05-06 15:54:47 +00:00
if (mem == XP_NULL) {
mem = (xp_stx_memory_t*)xp_malloc(xp_sizeof(xp_stx_memory_t));
if (mem == XP_NULL) return XP_NULL;
mem->__malloced = xp_true;
}
else mem->__malloced = xp_false;
slots = (xp_stx_object_t**)xp_malloc (
capacity * xp_sizeof(xp_stx_object_t*));
if (slots == XP_NULL) {
if (mem->__malloced) xp_free (mem);
mem = XP_NULL;
}
mem->capacity = capacity;
mem->slots = slots;
/* weave the free slot list */
mem->free = &slots[capacity - 1];
while (capacity > 1) {
capacity--;
mem->slots[capacity] = (xp_stx_object_t*)&mem->slots[capacity - 1];
}
mem->slots[--capacity] = XP_NULL;
return mem;
}
void xp_stx_memory_free (xp_stx_memory_t* mem)
{
/* TODO: free all linked objects... */
xp_free (mem->slots);
mem->capacity = 0;
mem->slots = XP_NULL;
mem->free = XP_NULL;
if (mem->__malloced) xp_free (mem);
}
/*
// resize the object table - mem
xp_stx_memory_t* xp_stx_memory_resize (xp_stx_memory_t* mem, xp_stx_word_t capacity)
{
}
*/
void xp_stx_garbage_collect (xp_stx_memory_t* mem)
{
/* TODO: implement this function */
}
xp_stx_word_t xp_stx_alloc_object (xp_stx_memory_t* mem, xp_stx_word_t nbytes)
{
xp_stx_object_t** slot;
xp_stx_object_t* object;
/* find the free object slot */
if (mem->free == XP_NULL) {
xp_stx_garbage_collect (mem);
if (mem->free == XP_NULL) return mem->capacity;
}
object = (xp_stx_object_t*)xp_malloc (nbytes);
if (object == XP_NULL) {
xp_stx_garbage_collect (mem);
object = (xp_stx_object_t*)xp_malloc (nbytes);
if (object == XP_NULL) return mem->capacity;
}
slot = mem->free;
mem->free = (xp_stx_object_t**)*slot;
*slot = object;
return (xp_stx_word_t)(slot - mem->slots);
}
void xp_stx_dealloc_object (xp_stx_memory_t* mem, xp_stx_word_t object_index)
{
/*
* THIS IS PRIMITIVE LOW-LEVEL DEALLOC. THIS WILL NOT
* DEALLOCATE MEMORY ALLOCATED FOR ITS INSTANCE VARIABLES.
*/
xp_free (mem->slots[object_index]);
mem->slots[object_index] = (xp_stx_object_t*)mem->free;
mem->free = &mem->slots[object_index];
}