From 8e94a64570d94821760c29181f7ec6feb0c72dcc Mon Sep 17 00:00:00 2001 From: Ferdinand Schober Date: Sun, 14 Jul 2024 12:02:14 +0200 Subject: [PATCH] ignore requests with capture / emulation disabled otherwise the server would hang when trying to enable clients --- src/server.rs | 11 ++++++++++- src/server/capture_task.rs | 9 ++++++--- src/server/emulation_task.rs | 22 +++++++++------------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/server.rs b/src/server.rs index 28a4e63..0994b1e 100644 --- a/src/server.rs +++ b/src/server.rs @@ -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, 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, 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( diff --git a/src/server/capture_task.rs b/src/server/capture_task.rs index 78d87f7..7655dfb 100644 --- a/src/server/capture_task.rs +++ b/src/server/capture_task.rs @@ -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, + } } } } diff --git a/src/server/emulation_task.rs b/src/server/emulation_task.rs index 554938a..a0212df 100644 --- a/src/server/emulation_task.rs +++ b/src/server/emulation_task.rs @@ -57,26 +57,22 @@ async fn emulation_task( capture_tx: Sender, ) { 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"); } }