* @}
*/
+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. */
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__)
{
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);
}
free(arg->result->info.ai_addr);
free(arg->result);
+ if (arg->data) ecore_con_server_infos_del(arg->data, arg);
free(arg);
}
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)
{
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;
}
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);
}
_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);
+ }
}
}
int write_buf_size;
int write_buf_offset;
unsigned char *write_buf;
+ Eina_List *infos;
int event_count;
int client_limit;
pid_t ppid;
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);
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);