ignore requests with capture / emulation disabled

otherwise the server would hang when trying to enable clients
This commit is contained in:
Ferdinand Schober
2024-07-14 12:02:14 +02:00
parent bba9400ab1
commit 8e94a64570
3 changed files with 25 additions and 17 deletions

View File

@@ -187,7 +187,10 @@ impl Server {
self.notify_frontend(FrontendEvent::PortChanged(self.port.get(), None));
}
request = request_rx.recv() => {
self.handle_request(&capture_tx.clone(), &emulation_tx.clone(), request.expect("channel closed")).await;
let request = request.expect("channel closed");
log::debug!("received frontend request: {request:?}");
self.handle_request(&capture_tx.clone(), &emulation_tx.clone(), request).await;
log::debug!("handled frontend request");
}
_ = self.notifies.frontend_event_pending.notified() => {
let events = self
@@ -376,6 +379,7 @@ impl Server {
emulate: &Sender<EmulationEvent>,
handle: ClientHandle,
) {
log::debug!("deactivating client {handle}");
match self.client_manager.borrow_mut().get_mut(handle) {
Some((_, s)) => s.active = false,
None => return,
@@ -383,6 +387,7 @@ impl Server {
let _ = capture.send(CaptureEvent::Destroy(handle)).await;
let _ = emulate.send(EmulationEvent::Destroy(handle)).await;
log::debug!("deactivating client {handle} done");
}
pub async fn activate_client(
@@ -391,6 +396,7 @@ impl Server {
emulate: &Sender<EmulationEvent>,
handle: ClientHandle,
) {
log::debug!("activating client");
/* deactivate potential other client at this position */
let pos = match self.client_manager.borrow().get(handle) {
Some((client, _)) => client.pos,
@@ -412,8 +418,11 @@ impl Server {
};
/* notify emulation, capture and frontends */
log::debug!("capture.send(Create)");
let _ = capture.send(CaptureEvent::Create(handle, pos.into())).await;
log::debug!("emulation.send(Create)");
let _ = emulate.send(EmulationEvent::Create(handle)).await;
log::debug!("activating client {handle} done");
}
pub async fn remove_client(

View File

@@ -61,9 +61,12 @@ async fn capture_task(
}
// allow cancellation
tokio::select! {
_ = server.capture_notified() => {},
_ = server.cancelled() => break,
loop {
tokio::select! {
_ = notify_rx.recv() => continue, /* need to ignore requests here! */
_ = server.capture_notified() => break,
_ = server.cancelled() => return,
}
}
}
}

View File

@@ -57,26 +57,22 @@ async fn emulation_task(
capture_tx: Sender<CaptureEvent>,
) {
loop {
match do_emulation(&server, &mut rx, &mut udp_rx, &sender_tx, &capture_tx).await {
Ok(()) => {}
Err(e) => {
log::warn!("input emulation exited: {e}");
}
if let Err(e) = do_emulation(&server, &mut rx, &mut udp_rx, &sender_tx, &capture_tx).await {
log::warn!("input emulation exited: {e}");
}
server.set_emulation_status(Status::Disabled);
if server.notifies.cancel.is_cancelled() {
if server.is_cancelled() {
break;
}
log::info!("waiting for user to request input emulation ...");
// allow cancellation
tokio::select! {
_ = server.emulation_notified() => {},
_ = server.cancelled() => break,
loop {
tokio::select! {
_ = rx.recv() => continue, /* need to ignore requests here! */
_ = server.emulation_notified() => break,
_ = server.cancelled() => return,
}
}
log::info!("... done");
}
}