Browse Source

wait for proper connection close

tags/fcgi-cgi-0.2.2
Stefan Bühler 7 years ago
parent
commit
b40d34f0c8
1 changed files with 30 additions and 11 deletions
  1. +30
    -11
      fastcgi.c

+ 30
- 11
fastcgi.c View File

@@ -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,7 +683,9 @@ void fastcgi_connection_close(fastcgi_connection *fcon) {
g_byte_array_set_size(fcon->parambuf, 0);
fastcgi_connection_environ_clear(fcon);

ev_prepare_start(fcon->fsrv->loop, &fcon->fsrv->closing_watcher);
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) {
@@ -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…
Cancel
Save