#include "jit-internal.h"
int jit_meta_set(jit_meta_t *list, int type, void *data,
jit_meta_free_func free_data, jit_function_t pool_owner)
{
jit_meta_t current;
current = *list;
while(current != 0)
{
if(current->type == type)
{
if(data == current->data)
{
return 1;
}
if(current->free_data)
{
(*(current->free_data))(current->data);
}
current->data = data;
current->free_data = free_data;
return 1;
}
current = current->next;
}
if(pool_owner)
{
if((current = jit_memory_pool_alloc
(&(pool_owner->builder->meta_pool), struct _jit_meta)) == 0)
{
return 0;
}
}
else
{
if((current = jit_new(struct _jit_meta)) == 0)
{
return 0;
}
}
current->type = type;
current->data = data;
current->free_data = free_data;
current->next = *list;
current->pool_owner = pool_owner;
*list = current;
return 1;
}
void *jit_meta_get(jit_meta_t list, int type)
{
while(list != 0)
{
if(list->type == type)
{
return list->data;
}
list = list->next;
}
return 0;
}
void jit_meta_free(jit_meta_t *list, int type)
{
jit_meta_t current = *list;
jit_meta_t prev = 0;
while(current != 0)
{
if(current->type == type)
{
if(current->free_data)
{
(*(current->free_data))(current->data);
current->free_data = 0;
}
if(prev)
{
prev->next = current->next;
}
else
{
*list = current->next;
}
if(current->pool_owner)
{
jit_memory_pool_dealloc
(&(current->pool_owner->builder->meta_pool), current);
}
else
{
jit_free(current);
}
return;
}
else
{
prev = current;
current = current->next;
}
}
}
void jit_meta_destroy(jit_meta_t *list)
{
jit_meta_t current = *list;
jit_meta_t next;
while(current != 0)
{
next = current->next;
if(current->free_data)
{
(*(current->free_data))(current->data);
current->free_data = 0;
}
if(current->pool_owner)
{
jit_memory_pool_dealloc
(&(current->pool_owner->builder->meta_pool), current);
}
else
{
jit_free(current);
}
current = next;
}
}
void _jit_meta_free_one(void *meta)
{
jit_meta_t current = (jit_meta_t)meta;
if(current->free_data)
{
(*(current->free_data))(current->data);
}
}