Skip to content

Commit

Permalink
Reimplements POST management with the new events management strategy.
Browse files Browse the repository at this point in the history
  • Loading branch information
alobbs committed Dec 23, 2011
1 parent c5d0353 commit 74792e7
Show file tree
Hide file tree
Showing 10 changed files with 130 additions and 149 deletions.
23 changes: 15 additions & 8 deletions cherokee/connection-poll.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,24 +28,31 @@
ret_t
cherokee_connection_poll_init (cherokee_connection_pool_t *conn_poll)
{
conn_poll->fd = -1;
conn_poll->mode = poll_mode_nothing;
conn_poll->fd = -1;
conn_poll->mode = poll_mode_nothing;

return ret_ok;
return ret_ok;
}

ret_t
cherokee_connection_poll_mrproper (cherokee_connection_pool_t *conn_poll)
{
UNUSED (conn_poll);
return ret_ok;
UNUSED (conn_poll);
return ret_ok;
}

ret_t
cherokee_connection_poll_clean (cherokee_connection_pool_t *conn_poll)
{
conn_poll->fd = -1;
conn_poll->mode = poll_mode_nothing;
conn_poll->fd = -1;
conn_poll->mode = poll_mode_nothing;

return ret_ok;
return ret_ok;
}

int
cherokee_connection_poll_is_set (cherokee_connection_pool_t *conn_poll)
{
return ((conn_poll->fd != -1) ||
(conn_poll->mode != poll_mode_nothing));
}
2 changes: 1 addition & 1 deletion cherokee/connection-poll.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,6 @@ typedef struct {
ret_t cherokee_connection_poll_init (cherokee_connection_pool_t *conn_poll);
ret_t cherokee_connection_poll_clean (cherokee_connection_pool_t *conn_poll);
ret_t cherokee_connection_poll_mrproper (cherokee_connection_pool_t *conn_poll);

int cherokee_connection_poll_is_set (cherokee_connection_pool_t *conn_poll);

#endif /* CHEROKEE_CONNECTION_POLL_H */
4 changes: 2 additions & 2 deletions cherokee/connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ cherokee_connection_new (cherokee_connection_t **conn)

cherokee_socket_init (&n->socket);
cherokee_header_init (&n->header, header_type_request);
cherokee_post_init (&n->post);
cherokee_post_init (&n->post, n);
cherokee_connection_poll_init (&n->polling_aim);

memset (n->regex_ovector, 0, OVECTOR_LEN * sizeof(int));
Expand Down Expand Up @@ -2218,7 +2218,7 @@ cherokee_connection_get_request (cherokee_connection_t *conn)
*/
if (read_post)
{
ret = cherokee_post_read_header (&conn->post, conn);
ret = cherokee_post_read_header (&conn->post);
if (unlikely (ret != ret_ok)) {
return ret;
}
Expand Down
24 changes: 6 additions & 18 deletions cherokee/handler_cgi.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,17 +434,16 @@ cherokee_handler_cgi_init (cherokee_handler_cgi_t *cgi)
ret_t
cherokee_handler_cgi_read_post (cherokee_handler_cgi_t *cgi)
{
ret_t ret;
cherokee_connection_t *conn = HANDLER_CONN(cgi);
cherokee_socket_status_t blocking = socket_closed;
cherokee_boolean_t did_IO = false;
ret_t ret;
cherokee_connection_t *conn = HANDLER_CONN(cgi);
cherokee_boolean_t did_IO = false;

if (! conn->post.has_info) {
return ret_ok;
}

ret = cherokee_post_send_to_fd (&conn->post, &conn->socket,
cgi->pipeOutput, NULL, &blocking, &did_IO);
cgi->pipeOutput, NULL, &did_IO);

if (did_IO) {
cherokee_connection_update_timeout (conn);
Expand All @@ -454,20 +453,9 @@ cherokee_handler_cgi_read_post (cherokee_handler_cgi_t *cgi)
case ret_ok:
break;
case ret_eagain:
if (blocking == socket_writing) {
conn->polling_aim.fd = cgi->pipeOutput;
conn->polling_aim.mode = poll_mode_write;

cherokee_thread_deactive_to_polling (HANDLER_THREAD(cgi), conn);
return ret_deny;
}

/* ret_eagain - Block on read
* ret_deny - Block on back-end write
/* conn->polling_aim.{fd,mode} was previously set by
* cherokee_post_send_to_fd()
*/
if (cherokee_post_has_buffered_info (&conn->post)) {
return ret_deny;
}
return ret_eagain;

default:
Expand Down
19 changes: 7 additions & 12 deletions cherokee/handler_fcgi.c
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,10 @@ do_send (cherokee_handler_fcgi_t *hdl,
case ret_eagain:
if (written > 0)
break;

conn->polling_aim.fd = hdl->socket.socket;
conn->polling_aim.mode = poll_mode_write;

return ret_eagain;
default:
conn->error_code = http_bad_gateway;
Expand Down Expand Up @@ -650,15 +654,10 @@ send_post (cherokee_handler_fcgi_t *hdl,
cherokee_connection_update_timeout (conn);
}

/* Block on back-end write
*/
if (buf->len > 0) {
return ret_deny;
}
break;
case ret_eagain:
/* EAGAIN on write */
return ret_deny;
/* conn->polling_aim set */
return ret_eagain;
case ret_eof:
case ret_error:
return ret_error;
Expand All @@ -671,11 +670,7 @@ send_post (cherokee_handler_fcgi_t *hdl,
/* Next iteration
*/
if (! cherokee_buffer_is_empty (buf)) {
conn->polling_aim.fd = hdl->socket.socket;
conn->polling_aim.mode = poll_mode_write;

cherokee_thread_deactive_to_polling (HANDLER_THREAD(hdl), conn);
return ret_deny;
return ret_eagain;
}

if (! cherokee_post_read_finished (&conn->post)) {
Expand Down
23 changes: 5 additions & 18 deletions cherokee/handler_scgi.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,15 +394,14 @@ cherokee_handler_scgi_init (cherokee_handler_scgi_t *hdl)
ret_t
cherokee_handler_scgi_read_post (cherokee_handler_scgi_t *hdl)
{
ret_t ret;
cherokee_connection_t *conn = HANDLER_CONN(hdl);
cherokee_socket_status_t blocking = socket_closed;
cherokee_boolean_t did_IO = false;
ret_t ret;
cherokee_connection_t *conn = HANDLER_CONN(hdl);
cherokee_boolean_t did_IO = false;

/* Client Socket -> Back-end SCGI
*/
ret = cherokee_post_send_to_socket (&conn->post, &conn->socket,
&hdl->socket, NULL, &blocking, &did_IO);
&hdl->socket, NULL, &did_IO);
if (did_IO) {
cherokee_connection_update_timeout (conn);
}
Expand All @@ -414,20 +413,8 @@ cherokee_handler_scgi_read_post (cherokee_handler_scgi_t *hdl)
break;

case ret_eagain:
if (blocking == socket_writing) {
conn->polling_aim.fd = hdl->socket.socket;
conn->polling_aim.mode = poll_mode_write;

cherokee_thread_deactive_to_polling (HANDLER_THREAD(hdl), conn);
return ret_deny;
}

/* ret_eagain - Block on read
* ret_deny - Block on back-end write
/* cherokee_post_send_to_socket() filled out conn->polling_aim
*/
if (cherokee_post_has_buffered_info (&conn->post)) {
return ret_deny;
}
return ret_eagain;

default:
Expand Down
23 changes: 5 additions & 18 deletions cherokee/handler_uwsgi.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,10 +427,9 @@ ret_t
cherokee_handler_uwsgi_read_post (cherokee_handler_uwsgi_t *hdl)
{
ret_t ret;
cherokee_connection_t *conn = HANDLER_CONN(hdl);
cherokee_socket_status_t blocking = socket_closed;
cherokee_handler_uwsgi_props_t *props = HANDLER_UWSGI_PROPS(hdl);
cherokee_boolean_t did_IO = false;
cherokee_connection_t *conn = HANDLER_CONN(hdl);
cherokee_handler_uwsgi_props_t *props = HANDLER_UWSGI_PROPS(hdl);
cherokee_boolean_t did_IO = false;

/* Should it send the post?
*/
Expand All @@ -441,7 +440,7 @@ cherokee_handler_uwsgi_read_post (cherokee_handler_uwsgi_t *hdl)
/* Send it
*/
ret = cherokee_post_send_to_socket (&conn->post, &conn->socket,
&hdl->socket, NULL, &blocking, &did_IO);
&hdl->socket, NULL, &did_IO);

if (did_IO) {
cherokee_connection_update_timeout (conn);
Expand All @@ -452,20 +451,8 @@ cherokee_handler_uwsgi_read_post (cherokee_handler_uwsgi_t *hdl)
break;

case ret_eagain:
if (blocking == socket_writing) {
conn->polling_aim.fd = hdl->socket.socket;
conn->polling_aim.mode = poll_mode_write;

cherokee_thread_deactive_to_polling (HANDLER_THREAD(hdl), conn);
return ret_deny;
}

/* ret_eagain - Block on read
* ret_deny - Block on back-end write
/* cherokee_post_send_to_socket() filled out conn->polling_aim
*/
if (cherokee_post_has_buffered_info (&conn->post)) {
return ret_deny;
}
return ret_eagain;

default:
Expand Down
Loading

0 comments on commit 74792e7

Please sign in to comment.