summaryrefslogtreecommitdiff
path: root/src/mod_cgi.c
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2019-02-28 23:58:49 -0500
committerGlenn Strauss <gstrauss@gluelogic.com>2019-03-07 00:32:17 -0500
commit9113011d5b2436ccd3db0f28aeebd3dc6016b688 (patch)
treeaf56b3015512ae2672ed38c97abeb2e5c0cf4448 /src/mod_cgi.c
parent0e108390e539f5b684b5db3005345cb1c9d2018a (diff)
downloadlighttpd-git-9113011d5b2436ccd3db0f28aeebd3dc6016b688.tar.gz
[core] pass (fdnode *) for registered fdevent fd
inline fdevent_fdnode_interest() avoid array lookup for (fdnode *) for various ops
Diffstat (limited to 'src/mod_cgi.c')
-rw-r--r--src/mod_cgi.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/mod_cgi.c b/src/mod_cgi.c
index 36e13d6c..0b06b96b 100644
--- a/src/mod_cgi.c
+++ b/src/mod_cgi.c
@@ -82,6 +82,8 @@ typedef struct {
pid_t pid;
int fd;
int fdtocgi;
+ fdnode *fdn;
+ fdnode *fdntocgi;
connection *remote_conn; /* dumb pointer */
plugin_data *plugin_data; /* dumb pointer */
@@ -281,9 +283,10 @@ static void cgi_pid_del(plugin_data *p, size_t i) {
static void cgi_connection_close_fdtocgi(server *srv, handler_ctx *hctx) {
/*(closes only hctx->fdtocgi)*/
- fdevent_event_del(srv->ev, hctx->fdtocgi);
+ fdevent_fdnode_event_del(srv->ev, hctx->fdntocgi);
/*fdevent_unregister(srv->ev, hctx->fdtocgi);*//*(handled below)*/
fdevent_sched_close(srv->ev, hctx->fdtocgi, 0);
+ hctx->fdntocgi = NULL;
hctx->fdtocgi = -1;
}
@@ -299,9 +302,10 @@ static void cgi_connection_close(server *srv, handler_ctx *hctx) {
if (hctx->fd != -1) {
/* close connection to the cgi-script */
- fdevent_event_del(srv->ev, hctx->fd);
+ fdevent_fdnode_event_del(srv->ev, hctx->fdn);
/*fdevent_unregister(srv->ev, hctx->fd);*//*(handled below)*/
fdevent_sched_close(srv->ev, hctx->fd, 0);
+ hctx->fdn = NULL;
}
if (hctx->fdtocgi != -1) {
@@ -408,7 +412,7 @@ static handler_t cgi_response_headers(server *srv, connection *con, struct http_
static int cgi_recv_response(server *srv, handler_ctx *hctx) {
switch (http_response_read(srv, hctx->remote_conn, &hctx->opts,
- hctx->response, hctx->fd)) {
+ hctx->response, hctx->fdn)) {
default:
return HANDLER_GO_ON;
case HANDLER_ERROR:
@@ -700,15 +704,15 @@ static int cgi_write_request(server *srv, handler_ctx *hctx, int fd) {
}
if (-1 == hctx->fdtocgi) { /*(not registered yet)*/
hctx->fdtocgi = fd;
- fdevent_register(srv->ev, hctx->fdtocgi, cgi_handle_fdevent_send, hctx);
+ hctx->fdntocgi = fdevent_register(srv->ev, hctx->fdtocgi, cgi_handle_fdevent_send, hctx);
}
if (0 == cqlen) { /*(chunkqueue_is_empty(cq))*/
- if ((fdevent_event_get_interest(srv->ev, hctx->fdtocgi) & FDEVENT_OUT)) {
- fdevent_event_set(srv->ev, hctx->fdtocgi, 0);
+ if ((fdevent_fdnode_interest(hctx->fdntocgi) & FDEVENT_OUT)) {
+ fdevent_fdnode_event_set(srv->ev, hctx->fdntocgi, 0);
}
} else {
/* more request body remains to be sent to CGI so register for fdevents */
- fdevent_event_set(srv->ev, hctx->fdtocgi, FDEVENT_OUT);
+ fdevent_fdnode_event_set(srv->ev, hctx->fdntocgi, FDEVENT_OUT);
}
}
@@ -847,13 +851,13 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, handler_
++srv->cur_fds;
}
- fdevent_register(srv->ev, hctx->fd, cgi_handle_fdevent, hctx);
+ hctx->fdn = fdevent_register(srv->ev, hctx->fd, cgi_handle_fdevent, hctx);
if (-1 == fdevent_fcntl_set_nb(srv->ev, hctx->fd)) {
log_error_write(srv, __FILE__, __LINE__, "ss", "fcntl failed: ", strerror(errno));
cgi_connection_close(srv, hctx);
return -1;
}
- fdevent_event_set(srv->ev, hctx->fd, FDEVENT_IN | FDEVENT_RDHUP);
+ fdevent_fdnode_event_set(srv->ev, hctx->fdn, FDEVENT_IN | FDEVENT_RDHUP);
return 0;
}
@@ -965,12 +969,12 @@ SUBREQUEST_FUNC(mod_cgi_handle_subrequest) {
if ((con->conf.stream_response_body & FDEVENT_STREAM_RESPONSE_BUFMIN)
&& con->file_started) {
if (chunkqueue_length(con->write_queue) > 65536 - 4096) {
- fdevent_event_clr(srv->ev, hctx->fd, FDEVENT_IN);
- } else if (!(fdevent_event_get_interest(srv->ev, hctx->fd) & FDEVENT_IN)) {
+ fdevent_fdnode_event_clr(srv->ev,hctx->fdn,FDEVENT_IN);
+ } else if (!(fdevent_fdnode_interest(hctx->fdn) & FDEVENT_IN)) {
/* optimistic read from backend */
handler_t rc = cgi_recv_response(srv, hctx); /*(might invalidate hctx)*/
if (rc != HANDLER_GO_ON) return rc; /*(unless HANDLER_GO_ON)*/
- fdevent_event_add(srv->ev, hctx->fd, FDEVENT_IN);
+ fdevent_fdnode_event_add(srv->ev, hctx->fdn, FDEVENT_IN);
}
}
@@ -984,7 +988,7 @@ SUBREQUEST_FUNC(mod_cgi_handle_subrequest) {
} else {
handler_t r = connection_handle_read_post_state(srv, con);
if (!chunkqueue_is_empty(cq)) {
- if (fdevent_event_get_interest(srv->ev, hctx->fdtocgi) & FDEVENT_OUT) {
+ if (fdevent_fdnode_interest(hctx->fdntocgi) & FDEVENT_OUT) {
return (r == HANDLER_GO_ON) ? HANDLER_WAIT_FOR_EVENT : r;
}
}