mirror of
https://github.com/emikulic/darkhttpd.git
synced 2023-08-10 21:13:08 +03:00
Another state transition optimization:
Go from send_header straight to send_reply.
This commit is contained in:
parent
844dcc6b9d
commit
3ed2762831
@ -299,6 +299,7 @@ static const char default_mimetype[] = "application/octet-stream";
|
|||||||
/* Prototypes. */
|
/* Prototypes. */
|
||||||
static void poll_recv_request(struct connection *conn);
|
static void poll_recv_request(struct connection *conn);
|
||||||
static void poll_send_header(struct connection *conn);
|
static void poll_send_header(struct connection *conn);
|
||||||
|
static void poll_send_reply(struct connection *conn);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -2085,13 +2086,18 @@ static void poll_send_header(struct connection *conn)
|
|||||||
conn->total_sent += sent;
|
conn->total_sent += sent;
|
||||||
total_out += sent;
|
total_out += sent;
|
||||||
|
|
||||||
/* check if we're done sending */
|
/* check if we're done sending header */
|
||||||
if (conn->header_sent == conn->header_length)
|
if (conn->header_sent == conn->header_length)
|
||||||
{
|
{
|
||||||
if (conn->header_only)
|
if (conn->header_only)
|
||||||
conn->state = DONE;
|
conn->state = DONE;
|
||||||
else
|
else {
|
||||||
conn->state = SEND_REPLY;
|
conn->state = SEND_REPLY;
|
||||||
|
/* go straight on to body, don't go through another iteration of
|
||||||
|
* the select() loop.
|
||||||
|
*/
|
||||||
|
poll_send_reply(conn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2159,6 +2165,8 @@ static void poll_send_reply(struct connection *conn)
|
|||||||
{
|
{
|
||||||
ssize_t sent;
|
ssize_t sent;
|
||||||
|
|
||||||
|
assert(conn->state == SEND_REPLY);
|
||||||
|
assert(!conn->header_only);
|
||||||
if (conn->reply_type == REPLY_GENERATED)
|
if (conn->reply_type == REPLY_GENERATED)
|
||||||
{
|
{
|
||||||
sent = send(conn->socket,
|
sent = send(conn->socket,
|
||||||
@ -2183,6 +2191,10 @@ static void poll_send_reply(struct connection *conn)
|
|||||||
{
|
{
|
||||||
if (sent == -1)
|
if (sent == -1)
|
||||||
{
|
{
|
||||||
|
if (errno == EAGAIN) {
|
||||||
|
if (debug) printf("poll_send_reply would have blocked\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (debug) printf("send(%d) error: %s\n",
|
if (debug) printf("send(%d) error: %s\n",
|
||||||
conn->socket, strerror(errno));
|
conn->socket, strerror(errno));
|
||||||
}
|
}
|
||||||
@ -2331,6 +2343,10 @@ static void httpd_poll(void)
|
|||||||
if (FD_ISSET(conn->socket, &send_set)) poll_send_reply(conn);
|
if (FD_ISSET(conn->socket, &send_set)) poll_send_reply(conn);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DONE:
|
||||||
|
/* do nothing (FIXME) */
|
||||||
|
break;
|
||||||
|
|
||||||
default: errx(1, "invalid state");
|
default: errx(1, "invalid state");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user