From 798085f860c11fedead5f56af55a2096f6387574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Mon, 8 Sep 2008 02:25:55 +0200 Subject: [PATCH] Fix some segfaults and add cleanup for worker split --- src/connection.c | 17 ++++++++--------- src/server.c | 2 ++ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/connection.c b/src/connection.c index 0926b2f..c558ebd 100644 --- a/src/connection.c +++ b/src/connection.c @@ -260,14 +260,12 @@ void connection_free(connection *con) { con->response_headers_sent = FALSE; con->expect_100_cont = FALSE; - ev_io_stop(con->wrk->loop, &con->sock_watcher); + if (con->wrk) + ev_io_stop(con->wrk->loop, &con->sock_watcher); if (con->sock_watcher.fd != -1) { - if (con->raw_in->is_closed) { /* read already shutdown */ - shutdown(con->sock_watcher.fd, SHUT_WR); - close(con->sock_watcher.fd); - } else { - worker_add_closing_socket(con->wrk, con->sock_watcher.fd); - } + /* just close it; _free should only be called on dead connections anyway */ + shutdown(con->sock_watcher.fd, SHUT_WR); + close(con->sock_watcher.fd); } ev_io_set(&con->sock_watcher, -1, 0); g_string_free(con->remote_addr_str, TRUE); @@ -287,13 +285,14 @@ void connection_free(connection *con) { physical_clear(&con->physical); response_clear(&con->response); - if (con->keep_alive_data.link) { + if (con->keep_alive_data.link && con->wrk) { g_queue_delete_link(&con->wrk->keep_alive_queue, con->keep_alive_data.link); con->keep_alive_data.link = NULL; } con->keep_alive_data.timeout = 0; con->keep_alive_data.max_idle = 0; - ev_timer_stop(con->wrk->loop, &con->keep_alive_data.watcher); + if (con->wrk) + ev_timer_stop(con->wrk->loop, &con->keep_alive_data.watcher); g_slice_free(connection, con); } diff --git a/src/server.c b/src/server.c index dab9066..84027aa 100644 --- a/src/server.c +++ b/src/server.c @@ -75,6 +75,8 @@ void server_free(server* srv) { srv->exiting = TRUE; server_stop(srv); + worker_free(srv->main_worker); + { /* close connections */ guint i; if (srv->connections_active > 0) {