diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2021-06-08 22:57:36 -0400 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2021-08-27 02:16:53 -0400 |
commit | af3df29ae8276f4380ed25262bcdf3d95446a9b1 (patch) | |
tree | 2606d798d156da68dbcfc3f68a3c8d03490dfa11 /src/mod_scgi.c | |
parent | 937d83b6cf8b732b2acae13919a8d944542acd9c (diff) | |
download | lighttpd-git-af3df29ae8276f4380ed25262bcdf3d95446a9b1.tar.gz |
[multiple] reduce redundant NULL buffer checks
This commit is a large set of code changes and results in removal of
hundreds, perhaps thousands, of CPU instructions, a portion of which
are on hot code paths.
Most (buffer *) used by lighttpd are not NULL, especially since buffers
were inlined into numerous larger structs such as request_st and chunk.
In the small number of instances where that is not the case, a NULL
check is often performed earlier in a function where that buffer is
later used with a buffer_* func. In the handful of cases that remained,
a NULL check was added, e.g. with r->http_host and r->conf.server_tag.
- check for empty strings at config time and set value to NULL if blank
string will be ignored at runtime; at runtime, simple pointer check
for NULL can be used to check for a value that has been set and is not
blank ("")
- use buffer_is_blank() instead of buffer_string_is_empty(),
and use buffer_is_unset() instead of buffer_is_empty(),
where buffer is known not to be NULL so that NULL check can be skipped
- use buffer_clen() instead of buffer_string_length() when buffer is
known not to be NULL (to avoid NULL check at runtime)
- use buffer_truncate() instead of buffer_string_set_length() to
truncate string, and use buffer_extend() to extend
Examples where buffer known not to be NULL:
- cpv->v.b from config_plugin_values_init is not NULL if T_CONFIG_BOOL
(though we might set it to NULL if buffer_is_blank(cpv->v.b))
- address of buffer is arg (&foo)
(compiler optimizer detects this in most, but not all, cases)
- buffer is checked for NULL earlier in func
- buffer is accessed in same scope without a NULL check (e.g. b->ptr)
internal behavior change:
callers must not pass a NULL buffer to some funcs.
- buffer_init_buffer() requires non-null args
- buffer_copy_buffer() requires non-null args
- buffer_append_string_buffer() requires non-null args
- buffer_string_space() requires non-null arg
Diffstat (limited to 'src/mod_scgi.c')
-rw-r--r-- | src/mod_scgi.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/mod_scgi.c b/src/mod_scgi.c index 70cf00b8..bed7b583 100644 --- a/src/mod_scgi.c +++ b/src/mod_scgi.c @@ -208,15 +208,15 @@ static handler_t scgi_create_env(handler_ctx *hctx) { size_t len; scgi_env_add(b, CONST_STR_LEN("SCGI"), CONST_STR_LEN("1")); buffer_clear(tb); - buffer_append_int(tb, buffer_string_length(b)-10); + buffer_append_int(tb, buffer_clen(b)-10); buffer_append_string_len(tb, CONST_STR_LEN(":")); - len = buffer_string_length(tb); + len = buffer_clen(tb); offset = 10 - len; memcpy(b->ptr+offset, tb->ptr, len); buffer_append_string_len(b, CONST_STR_LEN(",")); } else { /* LI_PROTOCOL_UWSGI */ /* http://uwsgi-docs.readthedocs.io/en/latest/Protocol.html */ - size_t len = buffer_string_length(b)-10; + size_t len = buffer_clen(b)-10; if (len > USHRT_MAX) { r->http_status = 431; /* Request Header Fields Too Large */ r->handler_module = NULL; @@ -231,7 +231,7 @@ static handler_t scgi_create_env(handler_ctx *hctx) { b->ptr[offset+3] = 0; } - hctx->wb_reqlen = buffer_string_length(b) - offset; + hctx->wb_reqlen = buffer_clen(b) - offset; chunkqueue_prepend_buffer_commit(&hctx->wb); chunkqueue_mark_written(&hctx->wb, offset); hctx->wb.bytes_in -= (off_t)offset; |