wait for proper connection close

This commit is contained in:
Stefan Bühler 2013-07-20 14:52:57 +02:00
parent 15394ede2f
commit b40d34f0c8

View File

@ -604,7 +604,31 @@ error:
static void fastcgi_connection_fd_cb(struct ev_loop *loop, ev_io *w, int revents) { static void fastcgi_connection_fd_cb(struct ev_loop *loop, ev_io *w, int revents) {
fastcgi_connection *fcon = (fastcgi_connection*) w->data; fastcgi_connection *fcon = (fastcgi_connection*) w->data;
UNUSED(loop);
if (fcon->closing) {
char buf[1024];
ssize_t r;
r = read(fcon->fd, buf, sizeof(buf));
if (r > 0) return;
if (-1 == r) switch (errno) {
case EINTR:
case EAGAIN:
#if EWOULDBLOCK != EAGAIN
case EWOULDBLOCK:
#endif
return; /* try again later */
default:
break;
}
ev_io_stop(loop, w);
close(fcon->fd);
fcon->fd = -1;
ev_prepare_start(fcon->fsrv->loop, &fcon->fsrv->closing_watcher);
return;
}
if (revents & EV_READ) { if (revents & EV_READ) {
read_queue(fcon); read_queue(fcon);
@ -637,11 +661,6 @@ static fastcgi_connection *fastcgi_connecion_create(fastcgi_server *fsrv, gint f
static void fastcgi_connection_free(fastcgi_connection *fcon) { static void fastcgi_connection_free(fastcgi_connection *fcon) {
fcon->fsrv->callbacks->cb_reset_connection(fcon); fcon->fsrv->callbacks->cb_reset_connection(fcon);
if (fcon->fd != -1) {
ev_io_stop(fcon->fsrv->loop, &fcon->fd_watcher);
close(fcon->fd);
fcon->fd = -1;
}
fastcgi_queue_clear(&fcon->write_queue); fastcgi_queue_clear(&fcon->write_queue);
fastcgi_connection_environ_clear(fcon); fastcgi_connection_environ_clear(fcon);
@ -655,9 +674,7 @@ static void fastcgi_connection_free(fastcgi_connection *fcon) {
void fastcgi_connection_close(fastcgi_connection *fcon) { void fastcgi_connection_close(fastcgi_connection *fcon) {
fcon->closing = TRUE; fcon->closing = TRUE;
if (fcon->fd != -1) { if (fcon->fd != -1) {
ev_io_stop(fcon->fsrv->loop, &fcon->fd_watcher); shutdown(fcon->fd, SHUT_WR);
close(fcon->fd);
fcon->fd = -1;
} }
fastcgi_queue_clear(&fcon->write_queue); fastcgi_queue_clear(&fcon->write_queue);
@ -666,7 +683,9 @@ void fastcgi_connection_close(fastcgi_connection *fcon) {
g_byte_array_set_size(fcon->parambuf, 0); g_byte_array_set_size(fcon->parambuf, 0);
fastcgi_connection_environ_clear(fcon); fastcgi_connection_environ_clear(fcon);
if (fcon->fd == -1) {
ev_prepare_start(fcon->fsrv->loop, &fcon->fsrv->closing_watcher); ev_prepare_start(fcon->fsrv->loop, &fcon->fsrv->closing_watcher);
}
} }
static void fastcgi_server_fd_cb(struct ev_loop *loop, ev_io *w, int revents) { static void fastcgi_server_fd_cb(struct ev_loop *loop, ev_io *w, int revents) {
@ -723,7 +742,7 @@ static void fastcgi_cleanup_connections(fastcgi_server *fsrv) {
for (i = 0; i < fsrv->connections->len; ) { for (i = 0; i < fsrv->connections->len; ) {
fastcgi_connection *fcon = g_ptr_array_index(fsrv->connections, i); fastcgi_connection *fcon = g_ptr_array_index(fsrv->connections, i);
if (fcon->closing) { if (fcon->closing && -1 == fcon->fd) {
fastcgi_connection *t_fcon; fastcgi_connection *t_fcon;
guint l = fsrv->connections->len-1; guint l = fsrv->connections->len-1;
t_fcon = g_ptr_array_index(fsrv->connections, i) = g_ptr_array_index(fsrv->connections, l); t_fcon = g_ptr_array_index(fsrv->connections, i) = g_ptr_array_index(fsrv->connections, l);