release capture only if no active capture at pos

This commit is contained in:
Ferdinand Schober
2024-10-08 14:26:29 +02:00
parent 06d4e8d836
commit 4a64a97273
2 changed files with 28 additions and 7 deletions

View File

@@ -228,6 +228,19 @@ async fn handle_capture_event(
enter_tx.send(handle).expect("channel closed"); enter_tx.send(handle).expect("channel closed");
} }
// incoming connection
if handle >= Service::ENTER_HANDLE_BEGIN {
// if there is no active outgoing connection at the current capture,
// we release the capture
if let Some(pos) = server.get_incoming_pos(handle) {
if server.client_manager.client_at(pos).is_none() {
capture.release().await?;
}
}
// we dont care about events from incoming handles except for releasing the capture
return Ok(());
}
// activated a new client // activated a new client
if event == CaptureEvent::Begin && Some(handle) != server.get_active() { if event == CaptureEvent::Begin && Some(handle) != server.get_active() {
*state = State::WaitingForAck; *state = State::WaitingForAck;

View File

@@ -70,7 +70,7 @@ pub struct Service {
capture_status: Rc<Cell<Status>>, capture_status: Rc<Cell<Status>>,
pub(crate) emulation_status: Rc<Cell<Status>>, pub(crate) emulation_status: Rc<Cell<Status>>,
pub(crate) should_release: Rc<RefCell<Option<ReleaseToken>>>, pub(crate) should_release: Rc<RefCell<Option<ReleaseToken>>>,
incoming_conns: Rc<RefCell<HashMap<ClientHandle, (String, SocketAddr)>>>, incoming_conns: Rc<RefCell<HashMap<ClientHandle, (String, SocketAddr, Position)>>>,
cert: Certificate, cert: Certificate,
next_trigger_handle: u64, next_trigger_handle: u64,
} }
@@ -203,7 +203,7 @@ impl Service {
} }
}, },
handle = capture.entered() => { handle = capture.entered() => {
if let Some((_fp, addr)) = self.incoming_conns.borrow().get(&handle) { if let Some((_fp, addr, _pos)) = self.incoming_conns.borrow().get(&handle) {
emulation.notify_release(*addr); emulation.notify_release(*addr);
} }
}, },
@@ -225,6 +225,8 @@ impl Service {
Ok(()) Ok(())
} }
pub(crate) const ENTER_HANDLE_BEGIN: u64 = u64::MAX / 2 + 1;
fn add_incoming( fn add_incoming(
&mut self, &mut self,
addr: SocketAddr, addr: SocketAddr,
@@ -232,13 +234,12 @@ impl Service {
fingerprint: String, fingerprint: String,
capture: &Capture, capture: &Capture,
) { ) {
const ENTER_HANDLE_BEGIN: u64 = u64::MAX / 2 + 1; let handle = Self::ENTER_HANDLE_BEGIN + self.next_trigger_handle;
let handle = ENTER_HANDLE_BEGIN + self.next_trigger_handle;
self.next_trigger_handle += 1; self.next_trigger_handle += 1;
capture.create(handle, pos); capture.create(handle, pos);
self.incoming_conns self.incoming_conns
.borrow_mut() .borrow_mut()
.insert(handle, (fingerprint, addr)); .insert(handle, (fingerprint, addr, pos));
} }
fn remove_incoming(&mut self, addr: SocketAddr, capture: &Capture) -> Option<String> { fn remove_incoming(&mut self, addr: SocketAddr, capture: &Capture) -> Option<String> {
@@ -246,13 +247,20 @@ impl Service {
.incoming_conns .incoming_conns
.borrow() .borrow()
.iter() .iter()
.find(|(_, (_, a))| *a == addr) .find(|(_, (_, a, _))| *a == addr)
.map(|(k, _)| *k)?; .map(|(k, _)| *k)?;
capture.destroy(handle); capture.destroy(handle);
self.incoming_conns self.incoming_conns
.borrow_mut() .borrow_mut()
.remove(&handle) .remove(&handle)
.map(|(f, _)| f) .map(|(f, _, _)| f)
}
pub(crate) fn get_incoming_pos(&self, handle: ClientHandle) -> Option<Position> {
self.incoming_conns
.borrow()
.get(&handle)
.map(|&(_, _, p)| p)
} }
fn notify_frontend(&self, event: FrontendEvent) { fn notify_frontend(&self, event: FrontendEvent) {