forked from enlightenment/efl
106 lines
3.7 KiB
C
106 lines
3.7 KiB
C
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
|
|
#include "Ecore.h"
|
|
#include "ecore_private.h"
|
|
#include "Ecore_Con.h"
|
|
#include "ecore_con_private.h"
|
|
|
|
typedef struct _Ecore_Con_Mempool Ecore_Con_Mempool;
|
|
struct _Ecore_Con_Mempool
|
|
{
|
|
const char *name;
|
|
Eina_Mempool *mp;
|
|
size_t size;
|
|
};
|
|
|
|
#define GENERIC_ALLOC_FREE(TYPE, Type) \
|
|
Ecore_Con_Mempool Type##_mp = { #TYPE, NULL, sizeof (TYPE) }; \
|
|
\
|
|
TYPE * \
|
|
Type##_alloc(void) \
|
|
{ \
|
|
return eina_mempool_malloc(Type##_mp.mp, sizeof (TYPE)); \
|
|
} \
|
|
\
|
|
void \
|
|
Type##_free(TYPE * e) \
|
|
{ \
|
|
eina_mempool_free(Type##_mp.mp, e); \
|
|
}
|
|
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Add, ecore_con_event_client_add);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Del, ecore_con_event_client_del);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Write, ecore_con_event_client_write);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Data, ecore_con_event_client_data);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Error, ecore_con_event_server_error);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Upgrade, ecore_con_event_server_upgrade);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Error, ecore_con_event_client_error);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Upgrade, ecore_con_event_client_upgrade);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Add, ecore_con_event_server_add);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Del, ecore_con_event_server_del);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Write, ecore_con_event_server_write);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Data, ecore_con_event_server_data);
|
|
GENERIC_ALLOC_FREE(Ecore_Con_Event_Proxy_Bind, ecore_con_event_proxy_bind);
|
|
|
|
static Ecore_Con_Mempool *mempool_array[] = {
|
|
&ecore_con_event_client_add_mp,
|
|
&ecore_con_event_client_del_mp,
|
|
&ecore_con_event_client_write_mp,
|
|
&ecore_con_event_client_data_mp,
|
|
&ecore_con_event_server_error_mp,
|
|
&ecore_con_event_server_upgrade_mp,
|
|
&ecore_con_event_client_error_mp,
|
|
&ecore_con_event_client_upgrade_mp,
|
|
&ecore_con_event_server_add_mp,
|
|
&ecore_con_event_server_del_mp,
|
|
&ecore_con_event_server_write_mp,
|
|
&ecore_con_event_server_data_mp,
|
|
&ecore_con_event_proxy_bind_mp
|
|
};
|
|
|
|
void
|
|
ecore_con_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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
ecore_con_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;
|
|
}
|
|
}
|
|
|