wait for proper connection close
This commit is contained in:
parent
15394ede2f
commit
b40d34f0c8
39
fastcgi.c
39
fastcgi.c
@ -604,7 +604,31 @@ error:
|
||||
|
||||
static void fastcgi_connection_fd_cb(struct ev_loop *loop, ev_io *w, int revents) {
|
||||
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) {
|
||||
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) {
|
||||
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_connection_environ_clear(fcon);
|
||||
@ -655,9 +674,7 @@ static void fastcgi_connection_free(fastcgi_connection *fcon) {
|
||||
void fastcgi_connection_close(fastcgi_connection *fcon) {
|
||||
fcon->closing = TRUE;
|
||||
if (fcon->fd != -1) {
|
||||
ev_io_stop(fcon->fsrv->loop, &fcon->fd_watcher);
|
||||
close(fcon->fd);
|
||||
fcon->fd = -1;
|
||||
shutdown(fcon->fd, SHUT_WR);
|
||||
}
|
||||
|
||||
fastcgi_queue_clear(&fcon->write_queue);
|
||||
@ -666,8 +683,10 @@ void fastcgi_connection_close(fastcgi_connection *fcon) {
|
||||
g_byte_array_set_size(fcon->parambuf, 0);
|
||||
fastcgi_connection_environ_clear(fcon);
|
||||
|
||||
if (fcon->fd == -1) {
|
||||
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) {
|
||||
fastcgi_server *fsrv = (fastcgi_server*) w->data;
|
||||
@ -723,7 +742,7 @@ static void fastcgi_cleanup_connections(fastcgi_server *fsrv) {
|
||||
|
||||
for (i = 0; i < fsrv->connections->len; ) {
|
||||
fastcgi_connection *fcon = g_ptr_array_index(fsrv->connections, i);
|
||||
if (fcon->closing) {
|
||||
if (fcon->closing && -1 == fcon->fd) {
|
||||
fastcgi_connection *t_fcon;
|
||||
guint l = fsrv->connections->len-1;
|
||||
t_fcon = g_ptr_array_index(fsrv->connections, i) = g_ptr_array_index(fsrv->connections, l);
|
||||
|
Loading…
Reference in New Issue
Block a user