Crash fix.

This commit is contained in:
Jan Vidar Krey 2009-11-21 11:47:26 +01:00
parent e994f23ea0
commit 53536f191d
6 changed files with 31 additions and 69 deletions

View File

@ -1030,10 +1030,7 @@ void hub_disconnect_user(struct hub_info* hub, struct hub_user* user, int reason
/* stop reading from user */ /* stop reading from user */
net_shutdown_r(user->connection->sd); net_shutdown_r(user->connection->sd);
if (net_con_close(user->connection)) net_con_close(user->connection);
{
hub_free(user->connection);
}
user->connection = 0; user->connection = 0;
LOG_TRACE("hub_disconnect_user(), user=%p, reason=%d, state=%d", user, reason, user->state); LOG_TRACE("hub_disconnect_user(), user=%p, reason=%d, state=%d", user, reason, user->state);

View File

@ -171,17 +171,6 @@ void net_event(struct net_connection* con, int event, void *arg)
struct hub_user* user = (struct hub_user*) arg; struct hub_user* user = (struct hub_user*) arg;
int flag_close = 0; int flag_close = 0;
if (event == NET_EVENT_DESTROYED)
{
LOG_PROTO("NET_EVENT_DESTROYED: con=%p, user=%p\n", con, user);
if (user)
{
user->connection = 0;
}
hub_free(con);
return;
}
#ifdef DEBUG_SENDQ #ifdef DEBUG_SENDQ
LOG_TRACE("net_event() : fd=%d, ev=%d, arg=%p", fd, (int) event, arg); LOG_TRACE("net_event() : fd=%d, ev=%d, arg=%p", fd, (int) event, arg);
#endif #endif

View File

@ -27,16 +27,6 @@ static void probe_net_event(struct net_connection* con, int events, void *arg)
{ {
struct hub_probe* probe = (struct hub_probe*) con->ptr; struct hub_probe* probe = (struct hub_probe*) con->ptr;
if (events == NET_EVENT_DESTROYED)
{
if (probe)
{
probe->connection = 0;
}
hub_free(con);
return;
}
if (events == NET_EVENT_SOCKERROR || events == NET_EVENT_CLOSED || events == NET_EVENT_TIMEOUT) if (events == NET_EVENT_SOCKERROR || events == NET_EVENT_CLOSED || events == NET_EVENT_TIMEOUT)
{ {
probe_destroy(probe); probe_destroy(probe);
@ -123,10 +113,7 @@ void probe_destroy(struct hub_probe* probe)
{ {
if (probe->connection) if (probe->connection)
{ {
if (net_con_close(probe->connection)) net_con_close(probe->connection);
{
hub_free(probe->connection);
}
probe->connection = 0; probe->connection = 0;
} }
hub_free(probe); hub_free(probe);

View File

@ -96,17 +96,38 @@ void net_con_set(struct net_connection* con)
if (CON->callback) \ if (CON->callback) \
CON->callback(con, EVENTS, CON->ptr); CON->callback(con, EVENTS, CON->ptr);
static void net_con_after_close(struct net_connection* con)
{
if (net_con_flag_get(con, NET_INITIALIZED))
{
LOG_MEMORY("DEL: close: CON={ %p, %p, %d, %d}", con, &con->event, con->sd, -1);
uhub_assert(net_con_flag_get(con, NET_EVENT_SET) != 0);
net_con_flag_unset(con, NET_EVENT_SET);
event_del(&con->event);
net_con_flag_unset(con, NET_INITIALIZED);
}
net_con_clear_timeout(con);
net_close(con->sd);
con->sd = -1;
hub_free(con);
}
static void net_con_event(int fd, short ev, void *arg) static void net_con_event(int fd, short ev, void *arg)
{ {
struct net_connection* con = (struct net_connection*) arg; struct net_connection* con = (struct net_connection*) arg;
int events = net_con_convert_from_libevent_mask(ev); int events = net_con_convert_from_libevent_mask(ev);
if (!con->flags) if (!net_con_flag_get(con, NET_INITIALIZED))
{
return; return;
}
if (net_con_flag_get(con, NET_CLEANUP)) if (net_con_flag_get(con, NET_CLEANUP))
{ {
hub_free(con); net_con_after_close(con);
return; return;
} }
@ -164,9 +185,7 @@ static void net_con_event(int fd, short ev, void *arg)
if (net_con_flag_get(con, NET_CLEANUP)) if (net_con_flag_get(con, NET_CLEANUP))
{ {
net_con_clear_timeout(con); net_con_after_close(con);
net_con_flag_unset(con, NET_INITIALIZED);
CALLBACK(con, NET_EVENT_DESTROYED);
} }
else else
{ {
@ -241,34 +260,18 @@ int net_con_close(struct net_connection* con)
{ {
uhub_assert(con); uhub_assert(con);
con->ptr = 0;
if (net_con_flag_get(con, NET_CLEANUP)) if (net_con_flag_get(con, NET_CLEANUP))
{
LOG_PROTO("Running net_con_close, but we already have closed...");
return 0; return 0;
}
if (net_con_flag_get(con, NET_PROCESSING_BUSY)) if (net_con_flag_get(con, NET_PROCESSING_BUSY))
{ {
LOG_PROTO("Trying to close socket while processing it");
net_con_flag_set(con, NET_CLEANUP); net_con_flag_set(con, NET_CLEANUP);
return 0; return 0;
} }
if (net_con_flag_get(con, NET_INITIALIZED)) net_con_after_close(con);
{
LOG_MEMORY("DEL: close: CON={ %p, %p, %d, %d}", con, &con->event, con->sd, -1);
uhub_assert(net_con_flag_get(con, NET_EVENT_SET) != 0);
net_con_flag_unset(con, NET_EVENT_SET);
event_del(&con->event);
net_con_flag_unset(con, NET_INITIALIZED);
}
net_con_clear_timeout(con);
net_close(con->sd);
con->sd = -1;
net_con_flag_set(con, NET_CLEANUP);
return 1; return 1;
} }

View File

@ -27,7 +27,6 @@
#define NET_EVENT_WRITE 0x0004 #define NET_EVENT_WRITE 0x0004
#define NET_EVENT_SOCKERROR 0x1000 /* Socket error, closed */ #define NET_EVENT_SOCKERROR 0x1000 /* Socket error, closed */
#define NET_EVENT_CLOSED 0x2000 /* Socket closed */ #define NET_EVENT_CLOSED 0x2000 /* Socket closed */
#define NET_EVENT_DESTROYED 0x4000 /* Struct is invalid and can be cleaned up */
struct net_connection; struct net_connection;
struct net_timer; struct net_timer;

View File

@ -81,17 +81,6 @@ static void event_callback(struct net_connection* con, int events, void *arg)
{ {
struct ADC_client* client = (struct ADC_client*) con->ptr; struct ADC_client* client = (struct ADC_client*) con->ptr;
if (events == NET_EVENT_DESTROYED)
{
printf("NET_EVENT_DESTROYED\n");
if (client)
{
client->con = 0;
}
hub_free(con);
return;
}
if (events == NET_EVENT_SOCKERROR || events == NET_EVENT_CLOSED) if (events == NET_EVENT_SOCKERROR || events == NET_EVENT_CLOSED)
{ {
printf("NET_EVENT_SOCKERROR || NET_EVENT_CLOSED\n"); printf("NET_EVENT_SOCKERROR || NET_EVENT_CLOSED\n");
@ -423,6 +412,7 @@ static void ADC_client_on_connected(struct ADC_client* client)
static void ADC_client_on_disconnected(struct ADC_client* client) static void ADC_client_on_disconnected(struct ADC_client* client)
{ {
net_con_close(client->con); net_con_close(client->con);
client->con = 0;
ADC_client_set_state(client, ps_none); ADC_client_set_state(client, ps_none);
} }
@ -436,10 +426,7 @@ void ADC_client_disconnect(struct ADC_client* client)
{ {
if (client->con && client->con->sd != -1) if (client->con && client->con->sd != -1)
{ {
if (net_con_close(client->con)) net_con_close(client->con);
{
hub_free(client->con);
}
client->con = 0; client->con = 0;
} }
} }