efl/src/lib/eet/eet_alloc.c

94 lines
3.0 KiB
C

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <Eina.h>
#include "Eet.h"
#include "Eet_private.h"
typedef struct _Eet_Mempool Eet_Mempool;
struct _Eet_Mempool
{
const char *name;
Eina_Mempool *mp;
size_t size;
};
#define GENERIC_ALLOC_FREE(TYPE, Type) \
Eet_Mempool Type##_mp = { #TYPE, NULL, sizeof (TYPE) }; \
\
TYPE * \
Type##_malloc(unsigned int num) \
{ \
return eina_mempool_malloc(Type##_mp.mp, num * sizeof (TYPE)); \
} \
TYPE * \
Type##_calloc(unsigned int num) \
{ \
return eina_mempool_calloc(Type##_mp.mp, num * sizeof (TYPE)); \
} \
void \
Type##_mp_free(TYPE *e) \
{ \
eina_mempool_free(Type##_mp.mp, e); \
}
GENERIC_ALLOC_FREE(Eet_File_Directory, eet_file_directory);
GENERIC_ALLOC_FREE(Eet_File_Node, eet_file_node);
GENERIC_ALLOC_FREE(Eet_File_Header, eet_file_header);
GENERIC_ALLOC_FREE(Eet_Dictionary, eet_dictionary);
GENERIC_ALLOC_FREE(Eet_File, eet_file);
static Eet_Mempool *mempool_array[] = {
&eet_file_directory_mp,
&eet_file_node_mp,
&eet_file_header_mp,
&eet_dictionary_mp,
&eet_file_mp,
};
Eina_Bool
eet_mempool_init(void)
{
const char *choice;
unsigned int i;
choice = getenv("EINA_MEMPOOL");
if ((!choice) || (!choice[0]))
choice = "chained_mempool";
for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
{
retry:
mempool_array[i]->mp = eina_mempool_add(choice, mempool_array[i]->name, NULL, mempool_array[i]->size, 16);
if (!mempool_array[i]->mp)
{
if (!(!strcmp(choice, "pass_through")))
{
ERR("Falling back to pass through ! Previously tried '%s' mempool.", choice);
choice = "pass_through";
goto retry;
}
else
{
ERR("Impossible to allocate mempool '%s' !", choice);
return EINA_FALSE;
}
}
}
return EINA_TRUE;
}
void
eet_mempool_shutdown(void)
{
unsigned int i;
for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
{
eina_mempool_del(mempool_array[i]->mp);
mempool_array[i]->mp = NULL;
}
}