connection_handle_write_cb(struct bufferevent *bufev, void *arg)
{
connection_t *conn = arg;
- (void) bufev;
+ struct evbuffer *output;
if (connection_flushed_some(conn)<0) {
connection_mark_for_close(conn);
return;
}
- if (!connection_wants_to_flush(conn)) {
+ output = bufferevent_get_output(bufev);
+ if (!evbuffer_get_length(output)) {
connection_finished_flushing(conn);
+ if (conn->marked_for_close && conn->hold_open_until_flushed)
+ conn->hold_open_until_flushed = 0;
}
}
assert_connection_ok(conn, now);
/* assert_all_pending_dns_resolves_ok(); */
+#ifdef USE_BUFFEREVENTS
+ if (conn->bufev && conn->hold_open_until_flushed)
+ return 0;
+#endif
+
log_debug(LD_NET,"Cleaning up connection (fd %d).",conn->s);
if ((conn->s >= 0 || conn->linked_conn) && connection_wants_to_flush(conn)) {
/* s == -1 means it's an incomplete edge connection, or that the socket