Investigate yielding issues in net serve

This commit is contained in:
Filip Tibell 2023-10-03 21:58:55 -05:00
parent 96adf83fad
commit fda0e9ab5e
No known key found for this signature in database

View file

@ -136,22 +136,27 @@ where
req = rx_request.recv() => (req, None), req = rx_request.recv() => (req, None),
sock = rx_websocket.recv() => (None, sock), sock = rx_websocket.recv() => (None, sock),
}; };
if req.is_none() && sock.is_none() {
break;
}
// NOTE: The closure here is not really necessary, we // NOTE: The closure here is not really necessary, we
// make the closure so that we can use the `?` operator // make the closure so that we can use the `?` operator
let handle_req_or_sock = || async { // and make a catch-all for errors in spawn_local below
let handle_request = config.handle_request.clone();
let handle_web_socket = config.handle_web_socket.clone();
let response_senders = Arc::clone(&response_senders_lua);
let response_fut = async move {
match (req, sock) { match (req, sock) {
(None, None) => Ok::<_, LuaError>(true),
(Some(req), _) => { (Some(req), _) => {
let req_id = req.id; let req_id = req.id;
let req_handler = config.handle_request.clone();
let req_table = req.into_lua_table(lua)?; let req_table = req.into_lua_table(lua)?;
let thread_id = sched.push_back(lua, req_handler, req_table)?; let thread_id = sched.push_back(lua, handle_request, req_table)?;
let thread_res = sched.wait_for_thread(lua, thread_id).await?; let thread_res = sched.wait_for_thread(lua, thread_id).await?;
let response = NetServeResponse::from_lua_multi(thread_res, lua)?; let response = NetServeResponse::from_lua_multi(thread_res, lua)?;
let response_sender = response_senders_lua let response_sender = response_senders
.lock() .lock()
.await .await
.remove(&req_id) .remove(&req_id)
@ -162,13 +167,12 @@ where
// handler being called, which is fine and should not emit errors // handler being called, which is fine and should not emit errors
response_sender.send(response).ok(); response_sender.send(response).ok();
Ok(false) Ok(())
} }
(_, Some(sock)) => { (_, Some(sock)) => {
let sock = sock.await.into_lua_err()?; let sock = sock.await.into_lua_err()?;
let sock_handler = config let sock_handler = handle_web_socket
.handle_web_socket
.as_ref() .as_ref()
.cloned() .cloned()
.expect("Got web socket but web socket handler is missing"); .expect("Got web socket but web socket handler is missing");
@ -180,15 +184,28 @@ where
let thread_id = sched.push_back(lua, sock_handler, sock_table)?; let thread_id = sched.push_back(lua, sock_handler, sock_table)?;
let _thread_res = sched.wait_for_thread(lua, thread_id).await?; let _thread_res = sched.wait_for_thread(lua, thread_id).await?;
Ok(false) Ok(())
} }
_ => unreachable!(),
} }
}; };
match handle_req_or_sock().await { /*
Ok(true) => break, NOTE: It is currently not possible to spawn new background tasks from within
Ok(false) => continue, another background task with the Lune scheduler since they are locked behind a
Err(e) => lua.emit_error(e), mutex and we also need that mutex locked to be able to run a background task...
We need to do some work to make it so our unordered futures queues do
not require locking and then we can replace the following bit of code:
sched.spawn_local(async {
if let Err(e) = response_fut.await {
lua.emit_error(e);
}
});
*/
if let Err(e) = response_fut.await {
lua.emit_error(e);
} }
} }
}); });