forked from enlightenment/efl
ecore: improve ecore_con speed by using mempool.
SVN revision: 64814
This commit is contained in:
parent
c369f1a1d7
commit
05d8a9cf3c
|
@ -39,8 +39,8 @@ SRCS = \
|
|||
ecore_con_server_simple_example.c \
|
||||
ecore_con_server_http_example.c \
|
||||
ecore_con_client_simple_example.c \
|
||||
client_bench.c \
|
||||
server_bench.c \
|
||||
ecore_client_bench.c \
|
||||
ecore_server_bench.c \
|
||||
ecore_con_client_example.c \
|
||||
ecore_con_server_example.c \
|
||||
ecore_fd_handler_gnutls_example.c \
|
||||
|
@ -91,7 +91,9 @@ pkglib_PROGRAMS += \
|
|||
ecore_evas_basics_example \
|
||||
ecore_evas_buffer_example_01 \
|
||||
ecore_evas_buffer_example_02 \
|
||||
ecore_evas_ews_example
|
||||
ecore_evas_ews_example \
|
||||
ecore_client_bench \
|
||||
ecore_server_bench
|
||||
|
||||
ecore_con_lookup_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
|
||||
ecore_con_url_headers_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
|
||||
|
@ -103,5 +105,7 @@ ecore_con_client_simple_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/li
|
|||
ecore_evas_window_sizes_example_LDADD = $(ECOREBASELDADD) @EVAS_LIBS@ $(top_builddir)/src/lib/ecore_evas/libecore_evas.la
|
||||
ecore_evas_buffer_example_01_LDADD = $(ECOREBASELDADD) @EVAS_LIBS@ $(top_builddir)/src/lib/ecore_evas/libecore_evas.la
|
||||
ecore_evas_buffer_example_02_LDADD = $(ECOREBASELDADD) @EVAS_LIBS@ $(top_builddir)/src/lib/ecore_evas/libecore_evas.la
|
||||
ecore_client_bench_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
|
||||
ecore_server_bench_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
|
||||
|
||||
endif
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* 2010 Mike Blumenkrantz
|
||||
*/
|
||||
|
||||
#define NUM_CLIENTS 10000
|
||||
#define NUM_CLIENTS 30000
|
||||
|
||||
static Eina_Counter *counter;
|
||||
static int add = 0;
|
|
@ -20,7 +20,8 @@ includesdir = $(includedir)/ecore-@VMAJ@
|
|||
libecore_con_la_SOURCES = \
|
||||
ecore_con.c \
|
||||
ecore_con_ssl.c \
|
||||
ecore_con_url.c
|
||||
ecore_con_url.c \
|
||||
ecore_con_alloc.c
|
||||
|
||||
if ECORE_HAVE_WIN32
|
||||
libecore_con_la_SOURCES += ecore_con_local_win32.c
|
||||
|
|
|
@ -143,6 +143,8 @@ ecore_con_init(void)
|
|||
return --_ecore_con_init_count;
|
||||
}
|
||||
|
||||
ecore_con_mempool_init();
|
||||
|
||||
ECORE_CON_EVENT_CLIENT_ADD = ecore_event_type_new();
|
||||
ECORE_CON_EVENT_CLIENT_DEL = ecore_event_type_new();
|
||||
ECORE_CON_EVENT_SERVER_ADD = ecore_event_type_new();
|
||||
|
@ -178,6 +180,8 @@ ecore_con_shutdown(void)
|
|||
EINA_LIST_FOREACH_SAFE(servers, l, l2, svr)
|
||||
_ecore_con_server_free(svr);
|
||||
|
||||
ecore_con_mempool_shutdown();
|
||||
|
||||
ecore_con_info_shutdown();
|
||||
ecore_con_ssl_shutdown();
|
||||
eina_log_domain_unregister(_ecore_con_log_dom);
|
||||
|
@ -932,7 +936,7 @@ ecore_con_event_server_add(Ecore_Con_Server *svr)
|
|||
Ecore_Con_Event_Server_Add *e;
|
||||
int ev = ECORE_CON_EVENT_SERVER_ADD;
|
||||
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
|
||||
e = ecore_con_event_server_add_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
svr->event_count++;
|
||||
|
@ -948,7 +952,7 @@ ecore_con_event_server_del(Ecore_Con_Server *svr)
|
|||
{
|
||||
Ecore_Con_Event_Server_Del *e;
|
||||
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
|
||||
e = ecore_con_event_server_del_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
svr->event_count++;
|
||||
|
@ -963,7 +967,7 @@ ecore_con_event_server_write(Ecore_Con_Server *svr, int num)
|
|||
{
|
||||
Ecore_Con_Event_Server_Write *e;
|
||||
|
||||
e = malloc(sizeof(Ecore_Con_Event_Server_Write));
|
||||
e = ecore_con_event_server_write_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
svr->event_count++;
|
||||
|
@ -979,7 +983,7 @@ ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num,
|
|||
{
|
||||
Ecore_Con_Event_Server_Data *e;
|
||||
|
||||
e = malloc(sizeof(Ecore_Con_Event_Server_Data));
|
||||
e = ecore_con_event_server_data_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
svr->event_count++;
|
||||
|
@ -990,8 +994,8 @@ ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num,
|
|||
e->data = malloc(num);
|
||||
if (!e->data)
|
||||
{
|
||||
ERR("alloc!");
|
||||
free(e);
|
||||
ERR("server data allocation failure !");
|
||||
_ecore_con_event_server_data_free(NULL, e);
|
||||
return;
|
||||
}
|
||||
memcpy(e->data, buf, num);
|
||||
|
@ -1009,7 +1013,7 @@ ecore_con_event_client_add(Ecore_Con_Client *cl)
|
|||
Ecore_Con_Event_Client_Add *e;
|
||||
int ev = ECORE_CON_EVENT_CLIENT_ADD;
|
||||
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Client_Add));
|
||||
e = ecore_con_event_client_add_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
cl->event_count++;
|
||||
|
@ -1027,7 +1031,7 @@ ecore_con_event_client_del(Ecore_Con_Client *cl)
|
|||
{
|
||||
Ecore_Con_Event_Client_Del *e;
|
||||
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
|
||||
e = ecore_con_event_client_del_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
if (cl)
|
||||
|
@ -1045,7 +1049,8 @@ void
|
|||
ecore_con_event_client_write(Ecore_Con_Client *cl, int num)
|
||||
{
|
||||
Ecore_Con_Event_Client_Write *e;
|
||||
e = malloc(sizeof(Ecore_Con_Event_Client_Write));
|
||||
|
||||
e = ecore_con_event_client_write_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
cl->host_server->event_count++;
|
||||
|
@ -1060,7 +1065,8 @@ void
|
|||
ecore_con_event_client_data(Ecore_Con_Client *cl, unsigned char *buf, int num, Eina_Bool duplicate)
|
||||
{
|
||||
Ecore_Con_Event_Client_Data *e;
|
||||
e = malloc(sizeof(Ecore_Con_Event_Client_Data));
|
||||
|
||||
e = ecore_con_event_client_data_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
cl->host_server->event_count++;
|
||||
|
@ -1072,8 +1078,8 @@ ecore_con_event_client_data(Ecore_Con_Client *cl, unsigned char *buf, int num, E
|
|||
e->data = malloc(num);
|
||||
if (!e->data)
|
||||
{
|
||||
free(cl->client_addr);
|
||||
free(cl);
|
||||
ERR("client data allocation failure !");
|
||||
_ecore_con_event_client_data_free(cl->host_server, e);
|
||||
return;
|
||||
}
|
||||
memcpy(e->data, buf, num);
|
||||
|
@ -1097,7 +1103,7 @@ ecore_con_event_server_error(Ecore_Con_Server *svr, const char *error)
|
|||
{
|
||||
Ecore_Con_Event_Server_Error *e;
|
||||
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Server_Error));
|
||||
e = ecore_con_event_server_error_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
e->server = svr;
|
||||
|
@ -1112,7 +1118,7 @@ ecore_con_event_client_error(Ecore_Con_Client *cl, const char *error)
|
|||
{
|
||||
Ecore_Con_Event_Client_Error *e;
|
||||
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Client_Error));
|
||||
e = ecore_con_event_client_error_alloc();
|
||||
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||
|
||||
e->client = cl;
|
||||
|
@ -2348,7 +2354,7 @@ _ecore_con_event_client_add_free(Ecore_Con_Server *svr,
|
|||
if ((svr->event_count <= 0) && (svr->delete_me))
|
||||
_ecore_con_server_free(svr);
|
||||
|
||||
free(e);
|
||||
ecore_con_event_client_add_free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2367,7 +2373,7 @@ _ecore_con_event_client_del_free(Ecore_Con_Server *svr,
|
|||
if ((svr->event_count <= 0) && (svr->delete_me))
|
||||
_ecore_con_server_free(svr);
|
||||
|
||||
free(e);
|
||||
ecore_con_event_client_del_free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2385,7 +2391,7 @@ _ecore_con_event_client_write_free(Ecore_Con_Server *svr,
|
|||
if ((svr->event_count <= 0) && (svr->delete_me))
|
||||
_ecore_con_server_free(svr);
|
||||
|
||||
free(e);
|
||||
ecore_con_event_client_write_free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2408,7 +2414,7 @@ _ecore_con_event_client_data_free(Ecore_Con_Server *svr,
|
|||
if ((svr->event_count <= 0) && (svr->delete_me))
|
||||
_ecore_con_server_free(svr);
|
||||
|
||||
free(e);
|
||||
ecore_con_event_client_data_free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2422,7 +2428,7 @@ _ecore_con_event_server_add_free(void *data __UNUSED__,
|
|||
if ((e->server->event_count <= 0) && (e->server->delete_me))
|
||||
_ecore_con_server_free(e->server);
|
||||
|
||||
free(e);
|
||||
ecore_con_event_server_add_free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2436,7 +2442,7 @@ _ecore_con_event_server_del_free(void *data __UNUSED__,
|
|||
if ((e->server->event_count <= 0) && (e->server->delete_me))
|
||||
_ecore_con_server_free(e->server);
|
||||
|
||||
free(e);
|
||||
ecore_con_event_server_del_free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2448,7 +2454,7 @@ _ecore_con_event_server_write_free(void *data __UNUSED__,
|
|||
if ((e->server->event_count <= 0) && (e->server->delete_me))
|
||||
_ecore_con_server_free(e->server);
|
||||
|
||||
free(e);
|
||||
ecore_con_event_server_write_free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2465,7 +2471,7 @@ _ecore_con_event_server_data_free(void *data __UNUSED__,
|
|||
if ((e->server->event_count <= 0) && (e->server->delete_me))
|
||||
_ecore_con_server_free(e->server);
|
||||
|
||||
free(e);
|
||||
ecore_con_event_server_data_free(e);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2476,7 +2482,8 @@ _ecore_con_event_server_error_free(void *data __UNUSED__, Ecore_Con_Event_Server
|
|||
if ((e->server->event_count <= 0) && (e->server->delete_me))
|
||||
_ecore_con_server_free(e->server);
|
||||
if (e->error) free(e->error);
|
||||
free(e);
|
||||
|
||||
ecore_con_event_server_error_free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2489,8 +2496,8 @@ _ecore_con_event_client_error_free(Ecore_Con_Server *svr, Ecore_Con_Event_Client
|
|||
if ((svr->event_count <= 0) && (svr->delete_me))
|
||||
_ecore_con_server_free(svr);
|
||||
if (e->error) free(e->error);
|
||||
free(e);
|
||||
|
||||
ecore_con_event_client_error_free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
#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_Client_Error, ecore_con_event_client_error);
|
||||
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);
|
||||
|
||||
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_client_error_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
|
||||
};
|
||||
|
||||
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, 64);
|
||||
if (!mempool_array[i]->mp)
|
||||
{
|
||||
if (strcmp(choice, "pass_through") != 0)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -298,5 +298,24 @@ int ecore_con_info_get(Ecore_Con_Server *svr,
|
|||
struct addrinfo *hints);
|
||||
|
||||
|
||||
#define GENERIC_ALLOC_FREE_HEADER(TYPE, Type) \
|
||||
TYPE *Type##_alloc(void); \
|
||||
void Type##_free(TYPE *e);
|
||||
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Add, ecore_con_event_client_add);
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Del, ecore_con_event_client_del);
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Write, ecore_con_event_client_write);
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Data, ecore_con_event_client_data);
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Error, ecore_con_event_server_error);
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Error, ecore_con_event_client_error);
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Add, ecore_con_event_server_add);
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Del, ecore_con_event_server_del);
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Write, ecore_con_event_server_write);
|
||||
GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Data, ecore_con_event_server_data);
|
||||
|
||||
void ecore_con_mempool_init(void);
|
||||
void ecore_con_mempool_shutdown(void);
|
||||
|
||||
#undef GENERIC_ALLOC_FREE_HEADER
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue