aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclaudio2021-04-20 07:35:42 +0000
committerWolfgang Müller2021-05-27 15:23:31 +0200
commita3d28320abd15348f982080792a3e16f47ca53c3 (patch)
tree2c71819030e4d64bb83c402799d3ec3e51903a92
parent5252ff504a3e153c7b5bf93ee845ec92b1dd7e0c (diff)
downloadslowcgi-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
-rw-r--r--slowcgi.c41
1 files changed, 8 insertions, 33 deletions
diff --git a/slowcgi.c b/slowcgi.c
index 391d882..d005cdd 100644
--- a/slowcgi.c
+++ b/slowcgi.c
@@ -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);