Fix mem leak
This commit is contained in:
+14
-1
@@ -1,3 +1,12 @@
|
|||||||
|
/*
|
||||||
|
* Design Doc:
|
||||||
|
* The server is broken into the following files:
|
||||||
|
* - main.c: Argument parsing and high-level control
|
||||||
|
* - http.c: HTTP request parsing and response formatting
|
||||||
|
* - server.c: Abstraction over sockets
|
||||||
|
* - threadpool.c: Thread pool and wokr queue implementation
|
||||||
|
* - util.c: Misc. utility functions
|
||||||
|
*/
|
||||||
#include "http.h"
|
#include "http.h"
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "threadpool.h"
|
#include "threadpool.h"
|
||||||
@@ -327,6 +336,10 @@ static void handle_connection(void *arg) {
|
|||||||
fclose(conn);
|
fclose(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fclose_free_func(void *file) {
|
||||||
|
fclose(file);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, const char **argv) {
|
int main(int argc, const char **argv) {
|
||||||
setenv("POSIXLY_CORRECT", "1", true);
|
setenv("POSIXLY_CORRECT", "1", true);
|
||||||
GlobalFlags flags = DEFAULT_FLAGS;
|
GlobalFlags flags = DEFAULT_FLAGS;
|
||||||
@@ -367,7 +380,7 @@ int main(int argc, const char **argv) {
|
|||||||
close(conn_fd);
|
close(conn_fd);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
thread_pool_enqueue(pool, handle_connection, conn);
|
thread_pool_enqueue(pool, handle_connection, conn, fclose_free_func);
|
||||||
}
|
}
|
||||||
destroy_thread_pool(pool);
|
destroy_thread_pool(pool);
|
||||||
destroy_server(server);
|
destroy_server(server);
|
||||||
|
|||||||
+12
-1
@@ -8,6 +8,7 @@
|
|||||||
struct thread_pool_queue {
|
struct thread_pool_queue {
|
||||||
Task task;
|
Task task;
|
||||||
void *arg;
|
void *arg;
|
||||||
|
FreeFunc ff;
|
||||||
struct thread_pool_queue *next;
|
struct thread_pool_queue *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -91,15 +92,25 @@ void destroy_thread_pool(ThreadPool *pool) {
|
|||||||
free(pool->threads);
|
free(pool->threads);
|
||||||
pthread_mutex_destroy(&pool->queue_mtx);
|
pthread_mutex_destroy(&pool->queue_mtx);
|
||||||
pthread_cond_destroy(&pool->queue_cnd);
|
pthread_cond_destroy(&pool->queue_cnd);
|
||||||
|
struct thread_pool_queue *queue = pool->queue;
|
||||||
|
while (queue) {
|
||||||
|
struct thread_pool_queue *next = queue->next;
|
||||||
|
if (queue->ff) {
|
||||||
|
queue->ff(queue->arg);
|
||||||
|
}
|
||||||
|
free(queue);
|
||||||
|
queue = next;
|
||||||
|
}
|
||||||
free(pool);
|
free(pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
void thread_pool_enqueue(ThreadPool *pool, Task task, void *arg) {
|
void thread_pool_enqueue(ThreadPool *pool, Task task, void *arg, FreeFunc ff) {
|
||||||
pthread_mutex_lock(&pool->queue_mtx);
|
pthread_mutex_lock(&pool->queue_mtx);
|
||||||
struct thread_pool_queue *new =
|
struct thread_pool_queue *new =
|
||||||
malloc_safe(sizeof(struct thread_pool_queue));
|
malloc_safe(sizeof(struct thread_pool_queue));
|
||||||
new->task = task;
|
new->task = task;
|
||||||
new->arg = arg;
|
new->arg = arg;
|
||||||
|
new->ff = ff;
|
||||||
new->next = pool->queue;
|
new->next = pool->queue;
|
||||||
pool->queue = new;
|
pool->queue = new;
|
||||||
pthread_cond_signal(&pool->queue_cnd);
|
pthread_cond_signal(&pool->queue_cnd);
|
||||||
|
|||||||
+2
-1
@@ -6,11 +6,12 @@
|
|||||||
|
|
||||||
typedef struct _ThreadPool ThreadPool;
|
typedef struct _ThreadPool ThreadPool;
|
||||||
typedef void (*Task)(void *);
|
typedef void (*Task)(void *);
|
||||||
|
typedef void (*FreeFunc)(void *);
|
||||||
|
|
||||||
ThreadPool *make_thread_pool(size_t parallelism, sigset_t sig_mask);
|
ThreadPool *make_thread_pool(size_t parallelism, sigset_t sig_mask);
|
||||||
|
|
||||||
void destroy_thread_pool(ThreadPool *pool);
|
void destroy_thread_pool(ThreadPool *pool);
|
||||||
|
|
||||||
void thread_pool_enqueue(ThreadPool *pool, Task task, void *arg);
|
void thread_pool_enqueue(ThreadPool *pool, Task task, void *arg, FreeFunc ff);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user