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