diff --git a/src/aws.c b/src/aws.c index 18ad8ee518e95279b881d63375b61fae53f69ddd..e23302e0cbbdf3cc71fd8a79f2a7f0dadca9ea21 100644 --- a/src/aws.c +++ b/src/aws.c @@ -140,7 +140,13 @@ void connection_start_async_io(struct connection *conn) /* AIO notify us when done */ io_set_eventfd(&conn->iocb, conn->eventfd); - io_submit(conn->ctx, 1, conn->piocb); + int ret = io_submit(conn->ctx, 1, conn->piocb); + + if (ret < 0) { + connection_remove(conn); + return; + } + conn->state = STATE_ASYNC_ONGOING; } @@ -494,12 +500,12 @@ void handle_output(struct connection *conn) } else if (ret == 0) { /* done */ - if (conn->file_pos < conn->file_size) - connection_start_async_io(conn); - else - connection_remove(conn); + connection_remove(conn); } else { + if (conn->state == STATE_ASYNC_ONGOING) + return; + w_epoll_update_ptr_out(epollfd, conn->sockfd, conn); }