diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2019-02-28 23:58:49 -0500 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2019-03-07 00:32:17 -0500 |
commit | 9113011d5b2436ccd3db0f28aeebd3dc6016b688 (patch) | |
tree | af56b3015512ae2672ed38c97abeb2e5c0cf4448 /src/mod_cgi.c | |
parent | 0e108390e539f5b684b5db3005345cb1c9d2018a (diff) | |
download | lighttpd-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.c | 30 |
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; } } |