mirror of
https://github.com/lune-org/lune.git
synced 2024-12-13 05:20:37 +00:00
Investigate yielding issues in net serve
This commit is contained in:
parent
96adf83fad
commit
fda0e9ab5e
1 changed files with 30 additions and 13 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue