Fix memory issues in ADC client lib.
This commit is contained in:
parent
a3d6646b99
commit
96ce64ee07
@ -80,6 +80,9 @@ void net_con_set(struct net_connection* con)
|
|||||||
net_con_flag_set(con, NET_INITIALIZED);
|
net_con_flag_set(con, NET_INITIALIZED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CALLBACK(CON, EVENTS) \
|
||||||
|
if (CON->callback) \
|
||||||
|
CON->callback(con, EVENTS, CON->ptr);
|
||||||
|
|
||||||
static void net_con_event(int fd, short ev, void *arg)
|
static void net_con_event(int fd, short ev, void *arg)
|
||||||
{
|
{
|
||||||
@ -92,7 +95,7 @@ static void net_con_event(int fd, short ev, void *arg)
|
|||||||
if (!con->ssl)
|
if (!con->ssl)
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
con->callback(con, events, con->ptr);
|
CALLBACK(con, events);
|
||||||
#ifdef SSL_SUPPORT
|
#ifdef SSL_SUPPORT
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -105,29 +108,29 @@ static void net_con_event(int fd, short ev, void *arg)
|
|||||||
if (net_con_flag_get(con, NET_WANT_SSL_ACCEPT))
|
if (net_con_flag_get(con, NET_WANT_SSL_ACCEPT))
|
||||||
{
|
{
|
||||||
if (net_con_ssl_accept(con) < 0)
|
if (net_con_ssl_accept(con) < 0)
|
||||||
con->callback(con, NET_EVENT_SOCKERROR, con->ptr);
|
CALLBACK(con, NET_EVENT_SOCKERROR);
|
||||||
}
|
}
|
||||||
else if (net_con_flag_get(con, NET_WANT_SSL_CONNECT))
|
else if (net_con_flag_get(con, NET_WANT_SSL_CONNECT))
|
||||||
{
|
{
|
||||||
if (net_con_ssl_connect(con) < 0)
|
if (net_con_ssl_connect(con) < 0)
|
||||||
con->callback(con, NET_EVENT_SOCKERROR, con->ptr);
|
CALLBACK(con, NET_EVENT_SOCKERROR);
|
||||||
}
|
}
|
||||||
else if (ev == EV_READ && net_con_flag_get(con, NET_WANT_SSL_READ))
|
else if (ev == EV_READ && net_con_flag_get(con, NET_WANT_SSL_READ))
|
||||||
{
|
{
|
||||||
con->callback(con, NET_EVENT_WRITE, con->ptr);
|
CALLBACK(con, NET_EVENT_WRITE);
|
||||||
}
|
}
|
||||||
else if (ev == EV_WRITE && net_con_flag_get(con, NET_WANT_SSL_WRITE))
|
else if (ev == EV_WRITE && net_con_flag_get(con, NET_WANT_SSL_WRITE))
|
||||||
{
|
{
|
||||||
con->callback(con, events & NET_EVENT_READ, con->ptr);
|
CALLBACK(con, events & NET_EVENT_READ);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
con->callback(con, events, con->ptr);
|
CALLBACK((con, events);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
con->callback(con, events, con->ptr);
|
CALLBACK(con, events);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -135,8 +138,8 @@ 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))
|
||||||
{
|
{
|
||||||
printf("SHOULD SCHEDULE SHUTTING DOWN SOCKET.");
|
|
||||||
net_con_flag_unset(con, NET_INITIALIZED);
|
net_con_flag_unset(con, NET_INITIALIZED);
|
||||||
|
CALLBACK(con, NET_EVENT_DESTROYED);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -214,7 +217,8 @@ void net_con_close(struct net_connection* con)
|
|||||||
|
|
||||||
if (net_con_flag_get(con, NET_PROCESSING_BUSY))
|
if (net_con_flag_get(con, NET_PROCESSING_BUSY))
|
||||||
{
|
{
|
||||||
LOG_INFO("Trying to close socket while processing it, will need to post a message about it...");
|
LOG_INFO("Trying to close socket while processing it");
|
||||||
|
net_con_flag_set(con, NET_CLEANUP);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#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;
|
||||||
@ -65,6 +66,13 @@ struct net_connection
|
|||||||
|
|
||||||
extern void net_con_initialize(struct net_connection* con, int sd, struct ip_addr_encap*, net_connection_cb callback, const void* ptr, int events);
|
extern void net_con_initialize(struct net_connection* con, int sd, struct ip_addr_encap*, net_connection_cb callback, const void* ptr, int events);
|
||||||
extern void net_con_update(struct net_connection* con, int events);
|
extern void net_con_update(struct net_connection* con, int events);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the connection.
|
||||||
|
* This will ensure a connection is closed properly and will generate a NET_EVENT_DESTROYED event which indicates
|
||||||
|
* that the con can safely be deleted (or set to NULL)
|
||||||
|
* NOTE: Do not dele
|
||||||
|
*/
|
||||||
extern void net_con_close(struct net_connection* con);
|
extern void net_con_close(struct net_connection* con);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,8 +80,18 @@ static void timer_callback(struct net_timer* t, void* arg)
|
|||||||
static void event_callback(struct net_connection* con, int events, void *arg)
|
static void event_callback(struct net_connection* con, int events, void *arg)
|
||||||
{
|
{
|
||||||
struct ADC_client* client = (struct ADC_client*) arg;
|
struct ADC_client* client = (struct ADC_client*) arg;
|
||||||
|
|
||||||
|
if (events == NET_EVENT_DESTROYED)
|
||||||
|
{
|
||||||
|
printf("NET_EVENT_DESTROYED\n");
|
||||||
|
hub_free(client->con);
|
||||||
|
client->con = 0;
|
||||||
|
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");
|
||||||
client->callback(client, ADC_CLIENT_DISCONNECTED, 0);
|
client->callback(client, ADC_CLIENT_DISCONNECTED, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -343,12 +353,13 @@ void ADC_client_destroy(struct ADC_client* client)
|
|||||||
{
|
{
|
||||||
ADC_client_disconnect(client);
|
ADC_client_disconnect(client);
|
||||||
net_timer_shutdown(client->timer);
|
net_timer_shutdown(client->timer);
|
||||||
|
hub_free(client->timer);
|
||||||
|
adc_msg_free(client->info);
|
||||||
hub_free(client->nick);
|
hub_free(client->nick);
|
||||||
hub_free(client->desc);
|
hub_free(client->desc);
|
||||||
hub_free(client->hub_address);
|
hub_free(client->hub_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ADC_client_connect(struct ADC_client* client, const char* address)
|
int ADC_client_connect(struct ADC_client* client, const char* address)
|
||||||
{
|
{
|
||||||
if (!client->hub_address)
|
if (!client->hub_address)
|
||||||
@ -391,8 +402,6 @@ 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);
|
||||||
hub_free(client->con);
|
|
||||||
client->con = 0;
|
|
||||||
ADC_client_set_state(client, ps_none);
|
ADC_client_set_state(client, ps_none);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -404,7 +413,7 @@ static void ADC_client_on_login(struct ADC_client* client)
|
|||||||
|
|
||||||
void ADC_client_disconnect(struct ADC_client* client)
|
void ADC_client_disconnect(struct ADC_client* client)
|
||||||
{
|
{
|
||||||
if (client->con->sd != -1)
|
if (client->con && client->con->sd != -1)
|
||||||
{
|
{
|
||||||
net_con_close(client->con);
|
net_con_close(client->con);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user