2008-07-30 06:35:49 -07:00
|
|
|
#include "eina_lalloc.h"
|
2008-07-30 05:46:55 -07:00
|
|
|
#include "eina_private.h"
|
|
|
|
|
2008-07-30 09:34:54 -07:00
|
|
|
struct _Eina_Lalloc
|
2008-07-30 05:46:55 -07:00
|
|
|
{
|
|
|
|
void *data;
|
|
|
|
int num_allocated;
|
|
|
|
int num_elements;
|
|
|
|
int acc;
|
2008-07-30 09:34:54 -07:00
|
|
|
Eina_Lalloc_Alloc alloc_cb;
|
|
|
|
Eina_Lalloc_Free free_cb;
|
2008-07-30 05:46:55 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To be documented
|
|
|
|
* FIXME: To be fixed
|
|
|
|
*/
|
2008-07-30 09:34:54 -07:00
|
|
|
EAPI Eina_Lalloc * eina_lalloc_new(void *data, Eina_Lalloc_Alloc alloc_cb, Eina_Lalloc_Free free_cb, int num_init)
|
2008-07-30 05:46:55 -07:00
|
|
|
{
|
2008-07-30 09:34:54 -07:00
|
|
|
Eina_Lalloc *a;
|
2008-07-30 05:46:55 -07:00
|
|
|
|
2008-07-30 09:34:54 -07:00
|
|
|
a = calloc(1, sizeof(Eina_Lalloc));
|
2008-07-30 05:46:55 -07:00
|
|
|
a->data = data;
|
|
|
|
a->alloc_cb = alloc_cb;
|
|
|
|
a->free_cb = free_cb;
|
|
|
|
if (num_init > 0)
|
|
|
|
{
|
|
|
|
a->num_allocated = num_init;
|
|
|
|
a->alloc_cb(a->data, a->num_allocated);
|
|
|
|
}
|
|
|
|
return a;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To be documented
|
|
|
|
* FIXME: To be fixed
|
|
|
|
*/
|
2008-07-30 09:34:54 -07:00
|
|
|
EAPI void eina_lalloc_element_add(Eina_Lalloc *a)
|
2008-07-30 05:46:55 -07:00
|
|
|
{
|
|
|
|
if (a->num_elements == a->num_allocated)
|
|
|
|
{
|
|
|
|
a->num_allocated = (1 << a->acc);
|
|
|
|
a->acc++;
|
|
|
|
a->alloc_cb(a->data, a->num_allocated);
|
|
|
|
}
|
|
|
|
a->num_elements++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To be documented
|
|
|
|
* FIXME: To be fixed
|
|
|
|
*/
|
2008-07-30 09:34:54 -07:00
|
|
|
EAPI void eina_lalloc_elements_add(Eina_Lalloc *a, int num)
|
2008-07-30 05:46:55 -07:00
|
|
|
{
|
|
|
|
int tmp;
|
|
|
|
|
|
|
|
tmp = a->num_elements + num;
|
|
|
|
if (tmp > a->num_allocated)
|
|
|
|
{
|
|
|
|
while (tmp > a->num_allocated)
|
|
|
|
{
|
|
|
|
a->num_allocated = (1 << a->acc);
|
|
|
|
a->acc++;
|
|
|
|
}
|
|
|
|
a->alloc_cb(a->data, a->num_allocated);
|
|
|
|
}
|
|
|
|
a->num_elements += num;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To be documented
|
|
|
|
* FIXME: To be fixed
|
|
|
|
*/
|
2008-07-30 09:34:54 -07:00
|
|
|
EAPI void eina_lalloc_free(Eina_Lalloc *a)
|
2008-07-30 05:46:55 -07:00
|
|
|
{
|
|
|
|
a->free_cb(a->data);
|
|
|
|
free(a);
|
|
|
|
}
|