diff options
author | claudio | 2021-04-20 07:35:42 +0000 |
---|---|---|
committer | Wolfgang Müller | 2021-05-27 15:23:31 +0200 |
commit | a3d28320abd15348f982080792a3e16f47ca53c3 (patch) | |
tree | 2c71819030e4d64bb83c402799d3ec3e51903a92 /slowcgi.c | |
parent | 5252ff504a3e153c7b5bf93ee845ec92b1dd7e0c (diff) | |
download | slowcgi-a3d28320abd15348f982080792a3e16f47ca53c3.tar.gz |
Use LIST instead of SLIST for requests. The way SLIST_REMOVE was used did a double traverse of the list which now is replaced with no traversal at all. Also stop double wrapping requests just for the list. OK millert@6.9
Diffstat (limited to 'slowcgi.c')
-rw-r--r-- | slowcgi.c | 41 |
1 files changed, 8 insertions, 33 deletions
@@ -1,4 +1,4 @@ -/* $OpenBSD: slowcgi.c,v 1.59 2021/04/20 07:32:19 claudio Exp $ */ +/* $OpenBSD: slowcgi.c,v 1.60 2021/04/20 07:35:42 claudio Exp $ */ /* * Copyright (c) 2013 David Gwynne <dlg@openbsd.org> * Copyright (c) 2013 Florian Obser <florian@openbsd.org> @@ -130,6 +130,7 @@ struct fcgi_stdin { TAILQ_HEAD(fcgi_stdin_head, fcgi_stdin); struct request { + LIST_ENTRY(request) entry; struct event ev; struct event resp_ev; struct event tmo; @@ -156,11 +157,7 @@ struct request { int inflight_fds_accounted; }; -struct requests { - SLIST_ENTRY(requests) entry; - struct request *request; -}; -SLIST_HEAD(requests_head, requests); +LIST_HEAD(requests_head, request); struct slowcgi_proc { struct requests_head requests; @@ -379,7 +376,7 @@ main(int argc, char *argv[]) lerr(1, "pledge"); #endif - SLIST_INIT(&slowcgi_proc.requests); + LIST_INIT(&slowcgi_proc.requests); event_init(); l = calloc(1, sizeof(*l)); @@ -472,7 +469,6 @@ slowcgi_accept(int fd, short events, void *arg) struct sockaddr_storage ss; struct timeval backoff; struct request *c; - struct requests *requests; socklen_t len; int s; @@ -506,14 +502,6 @@ slowcgi_accept(int fd, short events, void *arg) cgi_inflight--; return; } - requests = calloc(1, sizeof(*requests)); - if (requests == NULL) { - lwarn("cannot calloc requests"); - close(s); - cgi_inflight--; - free(c); - return; - } c->fd = s; c->buf_pos = 0; c->buf_len = 0; @@ -528,8 +516,7 @@ slowcgi_accept(int fd, short events, void *arg) event_set(&c->resp_ev, s, EV_WRITE | EV_PERSIST, slowcgi_response, c); evtimer_set(&c->tmo, slowcgi_timeout, c); evtimer_add(&c->tmo, &timeout); - requests->request = c; - SLIST_INSERT_HEAD(&slowcgi_proc.requests, requests, entry); + LIST_INSERT_HEAD(&slowcgi_proc.requests, c, entry); } void @@ -542,7 +529,6 @@ void slowcgi_sig_handler(int sig, short event, void *arg) { struct request *c; - struct requests *ncs; struct slowcgi_proc *p; pid_t pid; int status; @@ -552,12 +538,9 @@ slowcgi_sig_handler(int sig, short event, void *arg) switch (sig) { case SIGCHLD: while ((pid = waitpid(-1, &status, WNOHANG)) > 0) { - c = NULL; - SLIST_FOREACH(ncs, &p->requests, entry) - if (ncs->request->script_pid == pid) { - c = ncs->request; + LIST_FOREACH(c, &p->requests, entry) + if (c->script_pid == pid) break; - } if (c == NULL) { lwarnx("caught exit of unknown child %i", pid); continue; @@ -1150,7 +1133,6 @@ cleanup_request(struct request *c) struct fcgi_response *resp; struct fcgi_stdin *stdin_node; struct env_val *env_entry; - struct requests *ncs, *tcs; evtimer_del(&c->tmo); if (event_initialized(&c->ev)) @@ -1188,14 +1170,7 @@ cleanup_request(struct request *c) TAILQ_REMOVE(&c->stdin_head, stdin_node, entry); free(stdin_node); } - SLIST_FOREACH_SAFE(ncs, &slowcgi_proc.requests, entry, tcs) { - if (ncs->request == c) { - SLIST_REMOVE(&slowcgi_proc.requests, ncs, requests, - entry); - free(ncs); - break; - } - } + LIST_REMOVE(c, entry); if (! c->inflight_fds_accounted) cgi_inflight--; free(c); |