dns async lookup fix - if u del svr before dns lookup done

SVN revision: 56254
This commit is contained in:
Carsten Haitzler 2011-01-21 10:01:04 +00:00
parent d2d54ecad6
commit dca85251b0
4 changed files with 65 additions and 6 deletions

View File

@ -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 static void
_ecore_con_server_free(Ecore_Con_Server *svr) _ecore_con_server_free(Ecore_Con_Server *svr)
{ {
Ecore_Con_Client *cl; Ecore_Con_Client *cl;
double t_start, t; 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)) 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. */ /* this is a catch-all for cases when a server is not properly killed. */

View File

@ -302,9 +302,17 @@ ecore_con_info_get(Ecore_Con_Server *svr,
cares); cares);
} }
svr->infos = eina_list_append(svr->infos, cares);
return 1; return 1;
} }
void
ecore_con_info_data_clear(void *info)
{
Ecore_Con_CAres *cares = info;
cares->data = NULL;
}
static Eina_Bool static Eina_Bool
_ecore_con_info_cares_timeout_cb(void *data __UNUSED__) _ecore_con_info_cares_timeout_cb(void *data __UNUSED__)
{ {
@ -529,7 +537,11 @@ on_mem_error:
ERR("Not enough memory"); ERR("Not enough memory");
on_error: 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); free(arg);
} }
@ -567,6 +579,7 @@ _ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg,
free(arg->result->info.ai_addr); free(arg->result->info.ai_addr);
free(arg->result); free(arg->result);
if (arg->data) ecore_con_server_infos_del(arg->data, arg);
free(arg); free(arg);
} }

View File

@ -306,9 +306,17 @@ ecore_con_info_get(Ecore_Con_Server *svr,
info_slaves = (CB_Data *)eina_inlist_append(EINA_INLIST_GET( info_slaves = (CB_Data *)eina_inlist_append(EINA_INLIST_GET(
info_slaves), info_slaves),
EINA_INLIST_GET(cbdata)); EINA_INLIST_GET(cbdata));
svr->infos = eina_list_append(svr->infos, cbdata);
return 1; return 1;
} }
void
ecore_con_info_data_clear(void *info)
{
CB_Data *cbdata = info;
cbdata->data = NULL;
}
static void static void
_ecore_con_info_readdata(CB_Data *cbdata) _ecore_con_info_readdata(CB_Data *cbdata)
{ {
@ -347,15 +355,31 @@ _ecore_con_info_readdata(CB_Data *cbdata)
recv->info.ai_next = NULL; 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); free(torecv);
} }
else 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 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; cbdata->cb_done = NULL;
} }
@ -368,6 +392,7 @@ _ecore_con_info_slave_free(CB_Data *cbdata)
ecore_main_fd_handler_del(cbdata->fdh); ecore_main_fd_handler_del(cbdata->fdh);
ecore_event_handler_del(cbdata->handler); ecore_event_handler_del(cbdata->handler);
close(ecore_main_fd_handler_fd_get(cbdata->fdh)); close(ecore_main_fd_handler_fd_get(cbdata->fdh));
if (cbdata->data) ecore_con_server_infos_del(cbdata->data, cbdata);
free(cbdata); free(cbdata);
} }
@ -385,8 +410,12 @@ _ecore_con_info_data_handler(void *data,
_ecore_con_info_readdata(cbdata); _ecore_con_info_readdata(cbdata);
else else
{ {
cbdata->cb_done(cbdata->data, NULL); if (cbdata->data)
cbdata->cb_done = NULL; {
cbdata->cb_done(cbdata->data, NULL);
cbdata->cb_done = NULL;
ecore_con_server_infos_del(cbdata->data, cbdata);
}
} }
} }

View File

@ -127,6 +127,7 @@ struct _Ecore_Con_Server
int write_buf_size; int write_buf_size;
int write_buf_offset; int write_buf_offset;
unsigned char *write_buf; unsigned char *write_buf;
Eina_List *infos;
int event_count; int event_count;
int client_limit; int client_limit;
pid_t ppid; pid_t ppid;
@ -197,6 +198,9 @@ struct _Ecore_Con_Lookup
const void *data; const void *data;
}; };
/* from ecore_con.c */
void ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info);
/* from ecore_local.c */ /* from ecore_local.c */
int ecore_con_local_init(void); int ecore_con_local_init(void);
int ecore_con_local_shutdown(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, int ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
Ecore_Con_Info_Cb done_cb, Ecore_Con_Info_Cb done_cb,
void *data); void *data);
void ecore_con_info_data_clear(void *info);
/* from ecore_con_ssl.c */ /* from ecore_con_ssl.c */
Ecore_Con_Ssl_Error ecore_con_ssl_init(void); Ecore_Con_Ssl_Error ecore_con_ssl_init(void);
Ecore_Con_Ssl_Error ecore_con_ssl_shutdown(void); Ecore_Con_Ssl_Error ecore_con_ssl_shutdown(void);