feat(lnm): implement event loop state switching
parent
13ccfef94d
commit
799821d9fc
|
@ -264,6 +264,25 @@ void (*process_fns[])(lnm_http_conn *conn) = {
|
|||
lnm_http_loop_process_finish,
|
||||
};
|
||||
|
||||
lnm_loop_state state_map[] = {
|
||||
// parse_req
|
||||
lnm_loop_state_req,
|
||||
// route
|
||||
lnm_loop_state_req,
|
||||
// parse_headers
|
||||
lnm_loop_state_req,
|
||||
// steps
|
||||
lnm_loop_state_req,
|
||||
// write_status_line
|
||||
lnm_loop_state_res,
|
||||
// write_headers
|
||||
lnm_loop_state_res,
|
||||
// write_body
|
||||
lnm_loop_state_res,
|
||||
// finish
|
||||
lnm_loop_state_res,
|
||||
};
|
||||
|
||||
void lnm_http_loop_process(lnm_http_conn *conn) {
|
||||
const lnm_http_loop_ctx *ctx = conn->ctx;
|
||||
|
||||
|
@ -271,13 +290,20 @@ void lnm_http_loop_process(lnm_http_conn *conn) {
|
|||
lnm_loop_state loop_state = conn->state;
|
||||
|
||||
// We stop processing if:
|
||||
// - the event loop state has changed, as we need to switch to the other I/O
|
||||
// loop
|
||||
// - the event loop state has been explicitely changed inside the executed
|
||||
// step, as we need to switch to the other I/O loop
|
||||
// - the event loop state needs to be changed because the next step should be
|
||||
// run in another event loop state
|
||||
// - the process fn returned without changing the HTTP loop state, indicating
|
||||
// it's waiting for I/O
|
||||
do {
|
||||
http_loop_state = ctx->state;
|
||||
|
||||
process_fns[http_loop_state](conn);
|
||||
} while ((conn->state == loop_state) && (http_loop_state != ctx->state));
|
||||
} while ((conn->state == loop_state) &&
|
||||
(conn->state == state_map[loop_state]) &&
|
||||
(http_loop_state != ctx->state));
|
||||
|
||||
// Check required to prevent overwriting manually set event loop state
|
||||
conn->state = conn->state == loop_state ? state_map[loop_state] : conn->state;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue