diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2019-10-02 01:54:15 -0400 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2020-02-24 11:15:32 -0500 |
commit | b2991c686da3c8dbdd7d056b0eaf316af1428a79 (patch) | |
tree | 4c01182e42f85810d307bfb2d978c366745f2766 /src/http_header.c | |
parent | 2fd0faf1bfeae09bbd683e656f59fbe7d8de8e74 (diff) | |
download | lighttpd-git-b2991c686da3c8dbdd7d056b0eaf316af1428a79.tar.gz |
[core] perf: array.c performance enhancements
mark array_get_index() as hot, rewrite to be pure and return sorted pos
mark routines as pure, as appropriate
mark routines as cold if used only at startup for config processing
mark params const, as appropriate
array_get_buf_ptr() for modifiable value buffer after insert into array
uint32_t used and size members instead of size_t
remove a->unique_ndx member; simply add to end of array for value lists
remove du->is_index_key member; simply check buffer_is_empty(du->key)
array_insert_key_value() used to be a hint that lookup could be skipped,
but the state from array_get_index() is now saved and reused internally,
so the distinction is no longer needed. Use array_set_key_value().
Diffstat (limited to 'src/http_header.c')
-rw-r--r-- | src/http_header.c | 84 |
1 files changed, 26 insertions, 58 deletions
diff --git a/src/http_header.c b/src/http_header.c index c07ae079..b0c6aaeb 100644 --- a/src/http_header.c +++ b/src/http_header.c @@ -102,42 +102,24 @@ void http_header_response_set(connection *con, enum http_header_e id, const char } void http_header_response_append(connection *con, enum http_header_e id, const char *k, size_t klen, const char *v, size_t vlen) { - if (vlen) { - data_string *ds= (id <= HTTP_HEADER_OTHER || (con->response.htags & id)) - ? (data_string *)array_get_element_klen(con->response.headers,k,klen) - : NULL; - if (id > HTTP_HEADER_OTHER) con->response.htags |= id; - if (NULL == ds) { - array_insert_key_value(con->response.headers, k, klen, v, vlen); - } - else { /* append value */ - buffer *vb = ds->value; - if (!buffer_string_is_empty(vb)) - buffer_append_string_len(vb, CONST_STR_LEN(", ")); - buffer_append_string_len(vb, v, vlen); - } - } + if (0 == vlen) return; + if (id > HTTP_HEADER_OTHER) con->response.htags |= id; + buffer * const vb = array_get_buf_ptr(con->response.headers, k, klen); + if (!buffer_string_is_empty(vb)) /* append value */ + buffer_append_string_len(vb, CONST_STR_LEN(", ")); + buffer_append_string_len(vb, v, vlen); } void http_header_response_insert(connection *con, enum http_header_e id, const char *k, size_t klen, const char *v, size_t vlen) { - if (vlen) { - data_string *ds= (id <= HTTP_HEADER_OTHER || (con->response.htags & id)) - ? (data_string *)array_get_element_klen(con->response.headers,k,klen) - : NULL; - if (id > HTTP_HEADER_OTHER) con->response.htags |= id; - if (NULL == ds) { - array_insert_key_value(con->response.headers, k, klen, v, vlen); - } - else { /* append value */ - buffer *vb = ds->value; - if (!buffer_string_is_empty(vb)) { - buffer_append_string_len(vb, CONST_STR_LEN("\r\n")); - buffer_append_string_len(vb, k, klen); - buffer_append_string_len(vb, CONST_STR_LEN(": ")); - } - buffer_append_string_len(vb, v, vlen); - } + if (0 == vlen) return; + if (id > HTTP_HEADER_OTHER) con->response.htags |= id; + buffer * const vb = array_get_buf_ptr(con->response.headers, k, klen); + if (!buffer_string_is_empty(vb)) { /* append value */ + buffer_append_string_len(vb, CONST_STR_LEN("\r\n")); + buffer_append_string_len(vb, k, klen); + buffer_append_string_len(vb, CONST_STR_LEN(": ")); } + buffer_append_string_len(vb, v, vlen); } @@ -167,21 +149,12 @@ void http_header_request_set(connection *con, enum http_header_e id, const char } void http_header_request_append(connection *con, enum http_header_e id, const char *k, size_t klen, const char *v, size_t vlen) { - if (vlen) { - data_string *ds = (id <= HTTP_HEADER_OTHER || (con->request.htags & id)) - ? (data_string *)array_get_element_klen(con->request.headers, k, klen) - : NULL; - if (id > HTTP_HEADER_OTHER) con->request.htags |= id; - if (NULL == ds) { - array_insert_key_value(con->request.headers, k, klen, v, vlen); - } - else { /* append value */ - buffer *vb = ds->value; - if (!buffer_string_is_empty(vb)) - buffer_append_string_len(vb, CONST_STR_LEN(", ")); - buffer_append_string_len(vb, v, vlen); - } - } + if (0 == vlen) return; + if (id > HTTP_HEADER_OTHER) con->request.htags |= id; + buffer * const vb = array_get_buf_ptr(con->request.headers, k, klen); + if (!buffer_string_is_empty(vb)) /* append value */ + buffer_append_string_len(vb, CONST_STR_LEN(", ")); + buffer_append_string_len(vb, v, vlen); } @@ -196,15 +169,10 @@ void http_header_env_set(connection *con, const char *k, size_t klen, const char } void http_header_env_append(connection *con, const char *k, size_t klen, const char *v, size_t vlen) { - /*if (vlen)*/ /* skip check; permit env var w/ blank value to be appended */ - { - buffer * const vb = http_header_env_get(con, k, klen); - if (NULL == vb) { - array_insert_key_value(con->environment, k, klen, v, vlen); - } - else if (vlen) { /* append value */ - buffer_append_string_len(vb, CONST_STR_LEN(", ")); - buffer_append_string_len(vb, v, vlen); - } - } + /*if (0 == vlen) return;*//* skip check; permit env var w/ blank value */ + buffer * const vb = array_get_buf_ptr(con->environment, k, klen); + if (0 == vlen) return; + if (!buffer_string_is_empty(vb)) /* append value */ + buffer_append_string_len(vb, CONST_STR_LEN(", ")); + buffer_append_string_len(vb, v, vlen); } |