From dca85251b098f6063938eaf4e28dfbf8f1f791ba Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Fri, 21 Jan 2011 10:01:04 +0000 Subject: [PATCH] dns async lookup fix - if u del svr before dns lookup done SVN revision: 56254 --- legacy/ecore/src/lib/ecore_con/ecore_con.c | 11 ++++++ .../ecore/src/lib/ecore_con/ecore_con_ares.c | 15 ++++++- .../ecore/src/lib/ecore_con/ecore_con_info.c | 39 ++++++++++++++++--- .../src/lib/ecore_con/ecore_con_private.h | 6 +++ 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con.c b/legacy/ecore/src/lib/ecore_con/ecore_con.c index 279a3ee154..14025575c0 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con.c +++ b/legacy/ecore/src/lib/ecore_con/ecore_con.c @@ -1134,12 +1134,23 @@ ecore_con_client_flush(Ecore_Con_Client *cl) * @} */ +void +ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info) +{ + svr->infos = eina_list_remove(svr->infos, info); +} + static void _ecore_con_server_free(Ecore_Con_Server *svr) { Ecore_Con_Client *cl; double t_start, t; + while (svr->infos) + { + ecore_con_info_data_clear(svr->infos->data); + svr->infos = eina_list_remove_list(svr->infos, svr->infos); + } if ((!svr->write_buf) && svr->delete_me && (!svr->dead) && (svr->event_count < 1)) { /* this is a catch-all for cases when a server is not properly killed. */ diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con_ares.c b/legacy/ecore/src/lib/ecore_con/ecore_con_ares.c index fd0d661a77..9f395a4522 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con_ares.c +++ b/legacy/ecore/src/lib/ecore_con/ecore_con_ares.c @@ -302,9 +302,17 @@ ecore_con_info_get(Ecore_Con_Server *svr, cares); } + svr->infos = eina_list_append(svr->infos, cares); return 1; } +void +ecore_con_info_data_clear(void *info) +{ + Ecore_Con_CAres *cares = info; + cares->data = NULL; +} + static Eina_Bool _ecore_con_info_cares_timeout_cb(void *data __UNUSED__) { @@ -529,7 +537,11 @@ on_mem_error: ERR("Not enough memory"); on_error: - arg->done_cb(arg->data, NULL); + if (arg->data) + { + ecore_con_server_infos_del(arg->data, arg); + arg->done_cb(arg->data, NULL); + } free(arg); } @@ -567,6 +579,7 @@ _ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg, free(arg->result->info.ai_addr); free(arg->result); + if (arg->data) ecore_con_server_infos_del(arg->data, arg); free(arg); } diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con_info.c b/legacy/ecore/src/lib/ecore_con/ecore_con_info.c index 055218fc58..67ad68b7bb 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con_info.c +++ b/legacy/ecore/src/lib/ecore_con/ecore_con_info.c @@ -306,9 +306,17 @@ ecore_con_info_get(Ecore_Con_Server *svr, info_slaves = (CB_Data *)eina_inlist_append(EINA_INLIST_GET( info_slaves), EINA_INLIST_GET(cbdata)); + svr->infos = eina_list_append(svr->infos, cbdata); return 1; } +void +ecore_con_info_data_clear(void *info) +{ + CB_Data *cbdata = info; + cbdata->data = NULL; +} + static void _ecore_con_info_readdata(CB_Data *cbdata) { @@ -347,15 +355,31 @@ _ecore_con_info_readdata(CB_Data *cbdata) recv->info.ai_next = NULL; - cbdata->cb_done(cbdata->data, recv); + if (cbdata->data) + { + cbdata->cb_done(cbdata->data, recv); + ecore_con_server_infos_del(cbdata->data, cbdata); + } free(torecv); } else - cbdata->cb_done(cbdata->data, NULL); + { + if (cbdata->data) + { + cbdata->cb_done(cbdata->data, NULL); + ecore_con_server_infos_del(cbdata->data, cbdata); + } + } } else - cbdata->cb_done(cbdata->data, NULL); + { + if (cbdata->data) + { + cbdata->cb_done(cbdata->data, NULL); + ecore_con_server_infos_del(cbdata->data, cbdata); + } + } cbdata->cb_done = NULL; } @@ -368,6 +392,7 @@ _ecore_con_info_slave_free(CB_Data *cbdata) ecore_main_fd_handler_del(cbdata->fdh); ecore_event_handler_del(cbdata->handler); close(ecore_main_fd_handler_fd_get(cbdata->fdh)); + if (cbdata->data) ecore_con_server_infos_del(cbdata->data, cbdata); free(cbdata); } @@ -385,8 +410,12 @@ _ecore_con_info_data_handler(void *data, _ecore_con_info_readdata(cbdata); else { - cbdata->cb_done(cbdata->data, NULL); - cbdata->cb_done = NULL; + if (cbdata->data) + { + cbdata->cb_done(cbdata->data, NULL); + cbdata->cb_done = NULL; + ecore_con_server_infos_del(cbdata->data, cbdata); + } } } diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con_private.h b/legacy/ecore/src/lib/ecore_con/ecore_con_private.h index d4b4a58661..e7b8788b79 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con_private.h +++ b/legacy/ecore/src/lib/ecore_con/ecore_con_private.h @@ -127,6 +127,7 @@ struct _Ecore_Con_Server int write_buf_size; int write_buf_offset; unsigned char *write_buf; + Eina_List *infos; int event_count; int client_limit; pid_t ppid; @@ -197,6 +198,9 @@ struct _Ecore_Con_Lookup const void *data; }; +/* from ecore_con.c */ +void ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info); + /* from ecore_local.c */ int ecore_con_local_init(void); int ecore_con_local_shutdown(void); @@ -230,6 +234,8 @@ int ecore_con_info_udp_listen(Ecore_Con_Server *svr, int ecore_con_info_mcast_listen(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, void *data); +void ecore_con_info_data_clear(void *info); + /* from ecore_con_ssl.c */ Ecore_Con_Ssl_Error ecore_con_ssl_init(void); Ecore_Con_Ssl_Error ecore_con_ssl_shutdown(void);