diff options
| -rw-r--r-- | tcp_splice.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/tcp_splice.c b/tcp_splice.c index 4290268..5f41258 100644 --- a/tcp_splice.c +++ b/tcp_splice.c @@ -531,19 +531,22 @@ static int tcp_splice_forward(struct ctx *c, conn->pending[fromsidei] += readlen > 0 ? readlen : 0; conn->pending[fromsidei] -= written > 0 ? written : 0; - if (written < 0) { - if (!conn->pending[fromsidei]) - break; - - conn_event(conn, OUT_WAIT(!fromsidei)); + if (written < 0) break; - } if (conn->events & FIN_RCVD(fromsidei) && !conn->pending[fromsidei]) break; } + /* We need write-side wakeups if and only if we have data in the pipe to + * drain. + */ + if (conn->pending[fromsidei]) + conn_event(conn, OUT_WAIT(!fromsidei)); + else + conn_event(conn, ~OUT_WAIT(!fromsidei)); + if ((conn->events & FIN_RCVD(fromsidei)) && !(conn->events & FIN_SENT(!fromsidei)) && !conn->pending[fromsidei]) { @@ -606,7 +609,6 @@ void tcp_splice_sock_handler(struct ctx *c, union epoll_ref ref, if (events & EPOLLOUT) { if (tcp_splice_forward(c, conn, !evsidei, now)) goto reset; - conn_event(conn, ~OUT_WAIT(evsidei)); } if (events & (EPOLLIN | EPOLLRDHUP)) { |
