forked from enlightenment/efl
fix bug where server disconnect event was not emitted, only set magic to none on clients/servers after final event has been emitted, and only null the data pointer at this point as well
SVN revision: 54476
This commit is contained in:
parent
bdf50e0fc9
commit
c24c33cb54
|
@ -558,7 +558,6 @@ ecore_con_server_del(Ecore_Con_Server *svr)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
data = svr->data;
|
data = svr->data;
|
||||||
svr->data = NULL;
|
|
||||||
svr->delete_me = EINA_TRUE;
|
svr->delete_me = EINA_TRUE;
|
||||||
if (svr->event_count > 0)
|
if (svr->event_count > 0)
|
||||||
{
|
{
|
||||||
|
@ -1009,8 +1008,6 @@ ecore_con_client_del(Ecore_Con_Client *cl)
|
||||||
free(cl->client_addr);
|
free(cl->client_addr);
|
||||||
|
|
||||||
data = cl->data;
|
data = cl->data;
|
||||||
|
|
||||||
cl->data = NULL;
|
|
||||||
cl->delete_me = EINA_TRUE;
|
cl->delete_me = EINA_TRUE;
|
||||||
if (cl->event_count > 0)
|
if (cl->event_count > 0)
|
||||||
{
|
{
|
||||||
|
@ -1139,6 +1136,23 @@ _ecore_con_server_free(Ecore_Con_Server *svr)
|
||||||
Ecore_Con_Client *cl;
|
Ecore_Con_Client *cl;
|
||||||
double t_start, t;
|
double t_start, t;
|
||||||
|
|
||||||
|
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. */
|
||||||
|
|
||||||
|
Ecore_Con_Event_Server_Del *e;
|
||||||
|
|
||||||
|
svr->dead = EINA_TRUE;
|
||||||
|
INF("Lost server %s", svr->ip);
|
||||||
|
e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||||
|
|
||||||
|
svr->event_count++;
|
||||||
|
e->server = svr;
|
||||||
|
ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
|
||||||
|
_ecore_con_event_server_del_free, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
|
ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
|
||||||
t_start = ecore_time_get();
|
t_start = ecore_time_get();
|
||||||
while ((svr->write_buf) && (!svr->dead))
|
while ((svr->write_buf) && (!svr->dead))
|
||||||
|
@ -1180,6 +1194,7 @@ _ecore_con_server_free(Ecore_Con_Server *svr)
|
||||||
ecore_main_fd_handler_del(svr->fd_handler);
|
ecore_main_fd_handler_del(svr->fd_handler);
|
||||||
|
|
||||||
servers = eina_list_remove(servers, svr);
|
servers = eina_list_remove(servers, svr);
|
||||||
|
svr->data = NULL;
|
||||||
free(svr);
|
free(svr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1188,13 +1203,9 @@ _ecore_con_client_free(Ecore_Con_Client *cl)
|
||||||
{
|
{
|
||||||
double t_start, t;
|
double t_start, t;
|
||||||
|
|
||||||
ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
|
|
||||||
if ((!cl->buf) && cl->delete_me && (!cl->dead) && (cl->event_count < 1))
|
if ((!cl->buf) && cl->delete_me && (!cl->dead) && (cl->event_count < 1))
|
||||||
{
|
{
|
||||||
/* this is a catch-all for cases when a client is not properly killed.
|
/* this is a catch-all for cases when a client is not properly killed. */
|
||||||
* the only example case I've found so far is if a client ssl handshakes
|
|
||||||
* and then immediately disconnects without sending any further data.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* we lost our client! */
|
/* we lost our client! */
|
||||||
Ecore_Con_Event_Client_Del *e;
|
Ecore_Con_Event_Client_Del *e;
|
||||||
|
@ -1212,6 +1223,7 @@ _ecore_con_client_free(Ecore_Con_Client *cl)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
|
||||||
t_start = ecore_time_get();
|
t_start = ecore_time_get();
|
||||||
while ((cl->buf) && (!cl->dead))
|
while ((cl->buf) && (!cl->dead))
|
||||||
{
|
{
|
||||||
|
@ -1240,7 +1252,7 @@ _ecore_con_client_free(Ecore_Con_Client *cl)
|
||||||
|
|
||||||
if (cl->ip)
|
if (cl->ip)
|
||||||
free(cl->ip);
|
free(cl->ip);
|
||||||
|
cl->data = NULL;
|
||||||
free(cl);
|
free(cl);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue