From 979feaecc688f21a8f26122cbf6d429dd7850c5d Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 2 Mar 2014 16:32:07 +0900 Subject: [PATCH] Mitigate heap fragmentation when lots of concurrent http2 sessions run --- lib/nghttp2_pq.c | 2 +- lib/nghttp2_session.c | 50 ++++++++++++++++++++++--------------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/lib/nghttp2_pq.c b/lib/nghttp2_pq.c index 04fc48cc..33401bcb 100644 --- a/lib/nghttp2_pq.c +++ b/lib/nghttp2_pq.c @@ -26,7 +26,7 @@ int nghttp2_pq_init(nghttp2_pq *pq, nghttp2_compar compar) { - pq->capacity = 4096; + pq->capacity = 128; pq->q = malloc(pq->capacity * sizeof(void*)); if(pq->q == NULL) { return NGHTTP2_ERR_NOMEM; diff --git a/lib/nghttp2_session.c b/lib/nghttp2_session.c index d5d09a58..8ec5425d 100644 --- a/lib/nghttp2_session.c +++ b/lib/nghttp2_session.c @@ -239,6 +239,28 @@ static int nghttp2_session_new(nghttp2_session **session_ptr, /* next_stream_id is initialized in either nghttp2_session_client_new2 or nghttp2_session_server_new2 */ + rv = nghttp2_pq_init(&(*session_ptr)->ob_pq, nghttp2_outbound_item_compar); + if(rv != 0) { + goto fail_ob_pq; + } + rv = nghttp2_pq_init(&(*session_ptr)->ob_ss_pq, nghttp2_outbound_item_compar); + if(rv != 0) { + goto fail_ob_ss_pq; + } + + rv = nghttp2_hd_deflate_init(&(*session_ptr)->hd_deflater); + if(rv != 0) { + goto fail_hd_deflater; + } + rv = nghttp2_hd_inflate_init(&(*session_ptr)->hd_inflater); + if(rv != 0) { + goto fail_hd_inflater; + } + rv = nghttp2_map_init(&(*session_ptr)->streams); + if(rv != 0) { + goto fail_map; + } + (*session_ptr)->next_seq = 0; if((opt_set_mask & NGHTTP2_OPT_NO_AUTO_STREAM_WINDOW_UPDATE) && @@ -267,26 +289,6 @@ static int nghttp2_session_new(nghttp2_session **session_ptr, if(server) { (*session_ptr)->server = 1; } - rv = nghttp2_hd_deflate_init(&(*session_ptr)->hd_deflater); - if(rv != 0) { - goto fail_hd_deflater; - } - rv = nghttp2_hd_inflate_init(&(*session_ptr)->hd_inflater); - if(rv != 0) { - goto fail_hd_inflater; - } - rv = nghttp2_map_init(&(*session_ptr)->streams); - if(rv != 0) { - goto fail_map; - } - rv = nghttp2_pq_init(&(*session_ptr)->ob_pq, nghttp2_outbound_item_compar); - if(rv != 0) { - goto fail_ob_pq; - } - rv = nghttp2_pq_init(&(*session_ptr)->ob_ss_pq, nghttp2_outbound_item_compar); - if(rv != 0) { - goto fail_ob_ss_pq; - } (*session_ptr)->aob.framebuf = malloc (NGHTTP2_INITIAL_OUTBOUND_FRAMEBUF_LENGTH); @@ -318,16 +320,16 @@ static int nghttp2_session_new(nghttp2_session **session_ptr, return 0; fail_aob_framebuf: - nghttp2_pq_free(&(*session_ptr)->ob_ss_pq); - fail_ob_ss_pq: - nghttp2_pq_free(&(*session_ptr)->ob_pq); - fail_ob_pq: nghttp2_map_free(&(*session_ptr)->streams); fail_map: nghttp2_hd_inflate_free(&(*session_ptr)->hd_inflater); fail_hd_inflater: nghttp2_hd_deflate_free(&(*session_ptr)->hd_deflater); fail_hd_deflater: + nghttp2_pq_free(&(*session_ptr)->ob_ss_pq); + fail_ob_ss_pq: + nghttp2_pq_free(&(*session_ptr)->ob_pq); + fail_ob_pq: free(*session_ptr); fail_session: return rv;