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-08-04 09:50:03 -07:00
|
|
|
EAPI Eina_Bool eina_lalloc_element_add(Eina_Lalloc *a)
|
2008-07-30 05:46:55 -07:00
|
|
|
{
|
|
|
|
if (a->num_elements == a->num_allocated)
|
|
|
|
{
|
2008-08-04 09:50:03 -07:00
|
|
|
if (a->alloc_cb(a->data, (1 << a->acc)) == EINA_TRUE)
|
|
|
|
{
|
|
|
|
a->num_allocated = (1 << a->acc);
|
|
|
|
a->acc++;
|
|
|
|
} else {
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2008-07-30 05:46:55 -07:00
|
|
|
}
|
|
|
|
a->num_elements++;
|
2008-08-04 09:50:03 -07:00
|
|
|
|
|
|
|
return EINA_TRUE;
|
2008-07-30 05:46:55 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To be documented
|
|
|
|
* FIXME: To be fixed
|
|
|
|
*/
|
2008-08-04 09:50:03 -07:00
|
|
|
EAPI Eina_Bool eina_lalloc_elements_add(Eina_Lalloc *a, int num)
|
2008-07-30 05:46:55 -07:00
|
|
|
{
|
|
|
|
int tmp;
|
2008-08-04 09:50:03 -07:00
|
|
|
|
2008-07-30 05:46:55 -07:00
|
|
|
tmp = a->num_elements + num;
|
|
|
|
if (tmp > a->num_allocated)
|
|
|
|
{
|
2008-08-04 09:50:03 -07:00
|
|
|
int allocated;
|
|
|
|
int acc;
|
|
|
|
|
|
|
|
allocated = a->num_allocated;
|
|
|
|
acc = a->acc;
|
|
|
|
|
|
|
|
while (tmp > allocated)
|
2008-07-30 05:46:55 -07:00
|
|
|
{
|
2008-08-04 09:50:03 -07:00
|
|
|
allocated = (1 << acc);
|
|
|
|
acc++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a->alloc_cb(a->data, allocated) == EINA_TRUE)
|
|
|
|
{
|
|
|
|
a->num_allocated = allocated;
|
|
|
|
a->acc = acc;
|
|
|
|
} else {
|
|
|
|
return EINA_FALSE;
|
2008-07-30 05:46:55 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
a->num_elements += num;
|
2008-08-04 09:50:03 -07:00
|
|
|
|
|
|
|
return EINA_TRUE;
|
2008-07-30 05:46:55 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To be documented
|
|
|
|
* FIXME: To be fixed
|
|
|
|
*/
|
2008-08-04 09:50:03 -07:00
|
|
|
EAPI void eina_lalloc_delete(Eina_Lalloc *a)
|
2008-07-30 05:46:55 -07:00
|
|
|
{
|
|
|
|
a->free_cb(a->data);
|
|
|
|
free(a);
|
|
|
|
}
|