From 96777883172b1b7a06ab1dd0c5a4196171253cb1 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 23 May 2014 22:23:38 +0900 Subject: [PATCH] Don't count closed streams in nghttp2_session_want_{read,write} --- lib/nghttp2_session.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/nghttp2_session.c b/lib/nghttp2_session.c index 91356d2e..cf1e232b 100644 --- a/lib/nghttp2_session.c +++ b/lib/nghttp2_session.c @@ -5293,28 +5293,47 @@ int nghttp2_session_recv(nghttp2_session *session) } } +/* + * Returns the number of active streams, which includes streams in + * reserved state. + */ +static size_t session_get_num_active_streams(nghttp2_session *session) +{ + return nghttp2_map_size(&session->streams) - session->num_closed_streams; +} + int nghttp2_session_want_read(nghttp2_session *session) { + size_t num_active_streams; + /* If these flags are set, we don't want to read. The application should drop the connection. */ if((session->goaway_flags & NGHTTP2_GOAWAY_FAIL_ON_SEND) && (session->goaway_flags & NGHTTP2_GOAWAY_SEND)) { return 0; } + + num_active_streams = session_get_num_active_streams(session); + /* Unless GOAWAY is sent or received, we always want to read incoming frames. After GOAWAY is sent or received, we are only interested in active streams. */ - return !session->goaway_flags || nghttp2_map_size(&session->streams) > 0; + return !session->goaway_flags || num_active_streams > 0; } int nghttp2_session_want_write(nghttp2_session *session) { + size_t num_active_streams; + /* If these flags are set, we don't want to write any data. The application should drop the connection. */ if((session->goaway_flags & NGHTTP2_GOAWAY_FAIL_ON_SEND) && (session->goaway_flags & NGHTTP2_GOAWAY_SEND)) { return 0; } + + num_active_streams = session_get_num_active_streams(session); + /* * Unless GOAWAY is sent or received, we want to write frames if * there is pending ones. If pending frame is request/push response @@ -5325,7 +5344,7 @@ int nghttp2_session_want_write(nghttp2_session *session) return (session->aob.item != NULL || !nghttp2_pq_empty(&session->ob_pq) || (!nghttp2_pq_empty(&session->ob_ss_pq) && !session_is_outgoing_concurrent_streams_max(session))) && - (!session->goaway_flags || nghttp2_map_size(&session->streams) > 0); + (!session->goaway_flags || num_active_streams > 0); } int nghttp2_session_add_ping(nghttp2_session *session, uint8_t flags,