Skip to content

Commit 2446d20

Browse files
committed
wait for disconnect messages to be sent, avoid duplicates
1 parent 787b400 commit 2446d20

2 files changed

Lines changed: 17 additions & 27 deletions

File tree

src/host/misc.rs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::net::{FSPeer, Intro};
33
use crate::state::{NetHandler, State};
44
use alloc::boxed::Box;
55
use alloc::vec::Vec;
6-
use firefly_hal::Device;
6+
use firefly_hal::{Device, Network};
77

88
type C<'a, 'b> = wasmi::Caller<'a, Box<State<'b>>>;
99

@@ -272,7 +272,7 @@ pub(crate) fn set_peers(mut caller: C, peer_map: u32) {
272272
return;
273273
};
274274

275-
// TODO: do this into a single loop and without Vec.
275+
// TODO: do this in a single loop and without Vec.
276276
let mut to_remove: Vec<usize> = Vec::new();
277277
let mut peer_map = peer_map;
278278
for i in 0..connector.peer_infos.len() {
@@ -281,19 +281,27 @@ pub(crate) fn set_peers(mut caller: C, peer_map: u32) {
281281
}
282282
peer_map >>= 1;
283283
}
284-
to_remove.reverse();
285-
for i in to_remove {
286-
let res = connector.send_disconnect_to(&mut state.device, i);
287-
if let Err(err) = res {
288-
state.device.log_error("netcode", err);
284+
if !to_remove.is_empty() {
285+
to_remove.reverse();
286+
for i in to_remove {
287+
let res = connector.send_disconnect_to(&mut state.device, i);
288+
if let Err(err) = res {
289+
state.device.log_error("netcode", err);
290+
}
291+
connector.peer_infos.remove(i);
292+
}
293+
// If we sent disconnect to some peers and there are no more peers left
294+
// (which will make us disable networking below), wait a bit to make sure
295+
// the disconnect messages are delivered before we turn off wifi.
296+
if connector.peer_infos.is_empty() {
297+
state.device.delay(firefly_hal::Duration::from_ms(50));
289298
}
290-
connector.peer_infos.remove(i);
291299
}
292300

293301
if connector.peer_infos.is_empty() {
294302
state.set_next(None);
295303
state.net_handler.replace(NetHandler::None);
296-
let res = connector.cancel(&mut state.device);
304+
let res = state.device.net_stop();
297305
if let Err(err) = res {
298306
state.device.log_error("netcode", err);
299307
}
@@ -302,7 +310,6 @@ pub(crate) fn set_peers(mut caller: C, peer_map: u32) {
302310

303311
if let Err(err) = connector.validate() {
304312
state.device.log_error("netcode", err);
305-
// state.error = Some(ErrorScene::new(err.to_owned()))
306313
}
307314
state.set_next(None);
308315
let connection = connector.finalize(&mut state.device);

src/net/connector.rs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,6 @@ impl Connector {
3333
}
3434
}
3535

36-
/// Stop all network operations.
37-
pub fn cancel(self, device: &mut DeviceImpl) -> Result<(), NetcodeError> {
38-
self.send_disconnect(device)?;
39-
device.net_stop()?;
40-
Ok(())
41-
}
42-
4336
pub fn validate(&self) -> Result<(), &'static str> {
4437
for peer in &self.peer_infos {
4538
if peer.intro.version != self.me.version {
@@ -197,16 +190,6 @@ impl Connector {
197190
Ok(())
198191
}
199192

200-
fn send_disconnect(&self, device: &mut DeviceImpl) -> Result<(), NetcodeError> {
201-
let msg = Message::Req(Req::Disconnect);
202-
let mut buf = alloc::vec![0u8; MSG_SIZE];
203-
let raw = msg.encode(&mut buf)?;
204-
for addr in &self.peer_addrs {
205-
device.net_send(*addr, raw)?;
206-
}
207-
Ok(())
208-
}
209-
210193
pub fn send_disconnect_to(
211194
&self,
212195
device: &mut DeviceImpl,

0 commit comments

Comments
 (0)