Fix Memory leaks.
This commit is contained in:
@@ -45,6 +45,12 @@ static bool initialized = false;
|
|||||||
*/
|
*/
|
||||||
int _restd_log_level = RESTD_LOG_WARN;
|
int _restd_log_level = RESTD_LOG_WARN;
|
||||||
|
|
||||||
|
|
||||||
|
char *restd_server_get_option(restd_server_t *server, const char *key);
|
||||||
|
int restd_server_get_option_int(restd_server_t *server, const char *key);
|
||||||
|
static void close_server(restd_server_t *server);
|
||||||
|
static int notify_loopexit(restd_server_t *server);
|
||||||
|
|
||||||
/*--------------------------- PUBLIC FUNCTIONS -------------------------------*/
|
/*--------------------------- PUBLIC FUNCTIONS -------------------------------*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -108,7 +114,7 @@ void restd_server_free(restd_server_t *server)
|
|||||||
{
|
{
|
||||||
if (server == NULL)
|
if (server == NULL)
|
||||||
return;
|
return;
|
||||||
#if 0
|
|
||||||
int thread = restd_server_get_option_int(server, "server.thread");
|
int thread = restd_server_get_option_int(server, "server.thread");
|
||||||
if (thread && server->thread)
|
if (thread && server->thread)
|
||||||
{
|
{
|
||||||
@@ -144,7 +150,7 @@ void restd_server_free(restd_server_t *server)
|
|||||||
}
|
}
|
||||||
server->hooks->free(server->hooks);
|
server->hooks->free(server->hooks);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
free(server);
|
free(server);
|
||||||
DEBUG("Server terminated.");
|
DEBUG("Server terminated.");
|
||||||
}
|
}
|
||||||
@@ -181,3 +187,61 @@ void restd_server_register_hook_on_path(restd_server_t *server, const char *meth
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------- LOCAL FUNCTIONS -------------------------------*/
|
/*--------------------------- LOCAL FUNCTIONS -------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve server option.
|
||||||
|
*/
|
||||||
|
char *restd_server_get_option(restd_server_t *server, const char *key)
|
||||||
|
{
|
||||||
|
return server->options->getstr(server->options, key, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve server option in integer format.
|
||||||
|
*/
|
||||||
|
int restd_server_get_option_int(restd_server_t *server, const char *key)
|
||||||
|
{
|
||||||
|
char *value = restd_server_get_option(server, key);
|
||||||
|
return (value) ? atoi(value) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void close_server(restd_server_t *server)
|
||||||
|
{
|
||||||
|
DEBUG("Closing server.");
|
||||||
|
|
||||||
|
if (server->notify_buffer)
|
||||||
|
{
|
||||||
|
bufferevent_free(server->notify_buffer);
|
||||||
|
server->notify_buffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (server->listener)
|
||||||
|
{
|
||||||
|
evconnlistener_free(server->listener);
|
||||||
|
server->listener = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (server->thread)
|
||||||
|
{
|
||||||
|
void *retval = NULL;
|
||||||
|
DEBUG("Waiting server's last loop to finish.");
|
||||||
|
pthread_join(*(server->thread), &retval);
|
||||||
|
free(retval);
|
||||||
|
free(server->thread);
|
||||||
|
server->thread = NULL;
|
||||||
|
}
|
||||||
|
INFO("Server closed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If there's no event, loopbreak or loopexit call won't work until one more
|
||||||
|
* event arrived. So we use eventfd as a internal notification channel to let
|
||||||
|
* server get out of the loop without waiting for an event.
|
||||||
|
*/
|
||||||
|
static int notify_loopexit(restd_server_t *server)
|
||||||
|
{
|
||||||
|
uint64_t x = 0;
|
||||||
|
return bufferevent_write(server->notify_buffer, &x, sizeof(uint64_t));
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,6 +37,8 @@
|
|||||||
typedef struct restd_server_s restd_server_t;
|
typedef struct restd_server_s restd_server_t;
|
||||||
typedef struct restd_hook_s restd_hook_t;
|
typedef struct restd_hook_s restd_hook_t;
|
||||||
|
|
||||||
|
typedef int (*restd_callback)(short event, void *conn, void *userdata);
|
||||||
|
|
||||||
/*------------------------------- INCLUDES ----------------------------------*/
|
/*------------------------------- INCLUDES ----------------------------------*/
|
||||||
|
|
||||||
extern restd_server_t *restd_server_new(void);
|
extern restd_server_t *restd_server_new(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user