From 2a8561895de6a70db82212f483c66ec94c1768db Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 16 May 2017 15:20:39 +0200 Subject: [PATCH] MINOR: h2: create dummy idle and closed streams It will be more convenient to always manipulate existing streams than null pointers. Here we create one idle stream and one closed stream. The idea is that we can easily point any stream to one of these states in order to merge maintenance operations. --- src/mux_h2.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/mux_h2.c b/src/mux_h2.c index cbc1298d1..34b39fbf8 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -21,6 +21,10 @@ #include +/* dummy streams returned for idle and closed states */ +static const struct h2s *h2_closed_stream; +static const struct h2s *h2_idle_stream; + /* the h2c connection pool */ static struct pool_head *pool2_h2c; /* the h2s stream pool */ @@ -155,6 +159,22 @@ static int h2_settings_header_table_size = 4096; /* initial value */ static int h2_settings_initial_window_size = 65535; /* initial value */ static int h2_settings_max_concurrent_streams = 100; +/* a dmumy closed stream */ +static const struct h2s *h2_closed_stream = &(const struct h2s){ + .cs = NULL, + .h2c = NULL, + .st = H2_SS_CLOSED, + .id = 0, +}; + +/* and a dummy idle stream for use with any unannounced stream */ +static const struct h2s *h2_idle_stream = &(const struct h2s){ + .cs = NULL, + .h2c = NULL, + .st = H2_SS_IDLE, + .id = 0, +}; + /*****************************************************/ /* functions below are for dynamic buffer management */ @@ -322,9 +342,12 @@ static inline struct h2s *h2c_st_by_id(struct h2c *h2c, int id) { struct eb32_node *node; + if (id > h2c->max_id) + return (struct h2s *)h2_idle_stream; + node = eb32_lookup(&h2c->streams_by_id, id); if (!node) - return NULL; + return (struct h2s *)h2_closed_stream; return container_of(node, struct h2s, by_id); } -- 2.47.3