From 36c8de9da51d96845ba0081560554f19d33a1fa7 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 29 Mar 2014 23:17:39 +0900 Subject: [PATCH] Limit the number of streams in one dependency tree --- lib/nghttp2_session.c | 31 +++++++++++++++++++++++-------- lib/nghttp2_stream.h | 5 +++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/lib/nghttp2_session.c b/lib/nghttp2_session.c index 2f318457..bd169d1b 100644 --- a/lib/nghttp2_session.c +++ b/lib/nghttp2_session.c @@ -463,6 +463,7 @@ int nghttp2_session_reprioritize_stream nghttp2_stream_group *stream_group; nghttp2_stream_group *old_stream_group; nghttp2_stream *dep_stream; + nghttp2_stream *root_stream; const nghttp2_priority_group *group; const nghttp2_priority_dep *dep; @@ -529,11 +530,20 @@ int nghttp2_session_reprioritize_stream nghttp2_stream_dep_remove_subtree(stream); - if(dep->exclusive) { - rv = nghttp2_stream_dep_insert_subtree(dep_stream, stream, - &session->ob_pq); + root_stream = nghttp2_stream_get_dep_root(dep_stream); + + if(root_stream->num_substreams + stream->num_substreams > + NGHTTP2_MAX_DEP_TREE_LENGTH) { + rv = nghttp2_stream_dep_make_root(dep_stream->stream_group, stream, + &session->ob_pq); } else { - rv = nghttp2_stream_dep_add_subtree(dep_stream, stream, &session->ob_pq); + if(dep->exclusive) { + rv = nghttp2_stream_dep_insert_subtree(dep_stream, stream, + &session->ob_pq); + } else { + rv = nghttp2_stream_dep_add_subtree(dep_stream, stream, + &session->ob_pq); + } } if(rv != 0) { @@ -719,6 +729,7 @@ nghttp2_stream* nghttp2_session_open_stream(nghttp2_session *session, int rv; nghttp2_stream *stream; nghttp2_stream *dep_stream; + nghttp2_stream *root_stream; int32_t pri_group_id; uint8_t weight; nghttp2_stream_group *stream_group; @@ -809,10 +820,14 @@ nghttp2_stream* nghttp2_session_open_stream(nghttp2_session *session, return stream; } - if(pri_spec->dep.exclusive) { - nghttp2_stream_dep_insert(dep_stream, stream); - } else { - nghttp2_stream_dep_add(dep_stream, stream); + root_stream = nghttp2_stream_get_dep_root(dep_stream); + + if(root_stream->num_substreams < NGHTTP2_MAX_DEP_TREE_LENGTH) { + if(pri_spec->dep.exclusive) { + nghttp2_stream_dep_insert(dep_stream, stream); + } else { + nghttp2_stream_dep_add(dep_stream, stream); + } } return stream; diff --git a/lib/nghttp2_stream.h b/lib/nghttp2_stream.h index 9d352919..ce632b9d 100644 --- a/lib/nghttp2_stream.h +++ b/lib/nghttp2_stream.h @@ -35,6 +35,11 @@ #include "nghttp2_pq.h" #include "nghttp2_int.h" +/* + * Maximum number of streams in one dependency tree. + */ +#define NGHTTP2_MAX_DEP_TREE_LENGTH 100 + /* * If local peer is stream initiator: * NGHTTP2_STREAM_OPENING : upon sending request HEADERS