efl/legacy/eina/src/lib/eina_lalloc.c

79 lines
1.3 KiB
C
Raw Normal View History

#include "eina_lalloc.h"
#include "eina_private.h"
struct _Eina_Lalloc
{
void *data;
int num_allocated;
int num_elements;
int acc;
Eina_Lalloc_Alloc alloc_cb;
Eina_Lalloc_Free free_cb;
};
/**
* To be documented
* FIXME: To be fixed
*/
EAPI Eina_Lalloc * eina_lalloc_new(void *data, Eina_Lalloc_Alloc alloc_cb, Eina_Lalloc_Free free_cb, int num_init)
{
Eina_Lalloc *a;
a = calloc(1, sizeof(Eina_Lalloc));
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
*/
EAPI void eina_lalloc_element_add(Eina_Lalloc *a)
{
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
*/
EAPI void eina_lalloc_elements_add(Eina_Lalloc *a, int num)
{
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
*/
EAPI void eina_lalloc_free(Eina_Lalloc *a)
{
a->free_cb(a->data);
free(a);
}