diff options
author | Reyk Floeter <reyk@esdenera.com> | 2014-07-15 11:45:52 +0200 |
---|---|---|
committer | Reyk Floeter <reyk@esdenera.com> | 2014-07-15 11:45:52 +0200 |
commit | 435ab22dd5d9496a355be35e6540f0063f656465 (patch) | |
tree | 4f2e62eb8e1f1153cebb221090ebaf861551eab9 /server_file.c | |
parent | 9b7e15e3badd2165021ca8d072da56cc0d993d70 (diff) | |
download | httpd-435ab22dd5d9496a355be35e6540f0063f656465.tar.gz httpd-435ab22dd5d9496a355be35e6540f0063f656465.zip |
sync inflight wip
Diffstat (limited to 'server_file.c')
-rw-r--r-- | server_file.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/server_file.c b/server_file.c index e8db8a7..74a7106 100644 --- a/server_file.c +++ b/server_file.c @@ -84,7 +84,29 @@ server_file(struct httpd *env, struct client *clt) return (-1); } - if ((fd = open(path, O_RDONLY)) == -1 || fstat(fd, &st) == -1) + if ((fd = open(path, O_RDONLY)) == -1) { + /* + * Pause accept if we are out of file descriptors, or + * libevent will haunt us here too. + */ + if (errno == ENFILE || errno == EMFILE) { + struct timeval evtpause = { 1, 0 }; + + event_del(&srv->srv_ev); + evtimer_add(&srv->srv_evt, &evtpause); + log_debug("%s: deferring connections", __func__); + return (0); + } + } + + if (clt->clt_persist <= 1) { + server_inflight--; + DPRINTF("%s: inflight decremented, now %d", + __func__, server_inflight); + event_add(&srv->srv_ev, NULL); + } + + if (fstat(fd, &st) == -1) goto fail; media = media_find(env->sc_mediatypes, path); @@ -112,7 +134,7 @@ server_file(struct httpd *env, struct client *clt) bufferevent_settimeout(clt->clt_file, srv->srv_conf.timeout.tv_sec, srv->srv_conf.timeout.tv_sec); - bufferevent_enable(clt->clt_file, EV_READ); + bufferevent_enable(clt->clt_file, EV_READ|EV_WRITE); return (0); fail: |