|
@@ -1,5 +1,5 @@
|
|
|
// Code specific to the peer in the p2p mode.
|
|
|
-use mgen::{log, MessageHeader, SerializedMessage};
|
|
|
+use mgen::{log, updater::Updater, MessageHeader, SerializedMessage};
|
|
|
use rand_xoshiro::{rand_core::SeedableRng, Xoshiro256PlusPlus};
|
|
|
use serde::Deserialize;
|
|
|
use std::collections::HashMap;
|
|
@@ -31,13 +31,13 @@ type WriterFromState = mpsc::UnboundedReceiver<Arc<SerializedMessage>>;
|
|
|
/// Type for sending messages from the state thread to the writer thread.
|
|
|
type MessageHolder = Arc<SerializedMessage>;
|
|
|
/// Type for sending the updated read half of the socket.
|
|
|
-type ReadSocketUpdaterIn = mpsc::UnboundedSender<OwnedReadHalf>;
|
|
|
+type ReadSocketUpdaterIn = Arc<Updater<OwnedReadHalf>>;
|
|
|
/// Type for getting the updated read half of the socket.
|
|
|
-type ReadSocketUpdaterOut = mpsc::UnboundedReceiver<OwnedReadHalf>;
|
|
|
+type ReadSocketUpdaterOut = Updater<OwnedReadHalf>;
|
|
|
/// Type for sending the updated write half of the socket.
|
|
|
-type WriteSocketUpdaterIn = mpsc::UnboundedSender<OwnedWriteHalf>;
|
|
|
+type WriteSocketUpdaterIn = Updater<OwnedWriteHalf>;
|
|
|
/// Type for getting the updated write half of the socket.
|
|
|
-type WriteSocketUpdaterOut = mpsc::UnboundedReceiver<OwnedWriteHalf>;
|
|
|
+type WriteSocketUpdaterOut = Updater<OwnedWriteHalf>;
|
|
|
|
|
|
/// The conversation (state) thread tracks the conversation state
|
|
|
/// (i.e., whether the user is active or idle, and when to send messages).
|
|
@@ -114,12 +114,8 @@ async fn listener(
|
|
|
let (channel_to_reader, channel_to_writer) = name_to_io_threads
|
|
|
.get(&from)
|
|
|
.unwrap_or_else(|| panic!("{} got connection from unknown contact: {}", address, from));
|
|
|
- channel_to_reader
|
|
|
- .send(rd)
|
|
|
- .expect("listener: Channel to reader closed");
|
|
|
- channel_to_writer
|
|
|
- .send(wr)
|
|
|
- .expect("listener: Channel to writer closed");
|
|
|
+ channel_to_reader.send(rd);
|
|
|
+ channel_to_writer.send(wr);
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
@@ -141,10 +137,7 @@ async fn reader(
|
|
|
) {
|
|
|
loop {
|
|
|
// wait for listener or writer thread to give us a stream to read from
|
|
|
- let mut stream = connection_channel
|
|
|
- .recv()
|
|
|
- .await
|
|
|
- .expect("reader: Channel to reader closed");
|
|
|
+ let mut stream = connection_channel.recv().await;
|
|
|
loop {
|
|
|
let msg = if let Ok(msg) = mgen::get_message(&mut stream).await {
|
|
|
msg
|
|
@@ -228,7 +221,7 @@ async fn writer<'a>(
|
|
|
retry: Duration,
|
|
|
) -> Result<OwnedWriteHalf, FatalError> {
|
|
|
// first check if the listener thread already has a socket
|
|
|
- if let Ok(wr) = write_socket_updater.try_recv() {
|
|
|
+ if let Some(wr) = write_socket_updater.maybe_recv() {
|
|
|
return Ok(wr);
|
|
|
}
|
|
|
|
|
@@ -251,9 +244,7 @@ async fn writer<'a>(
|
|
|
.write_all(&mgen::serialize_str(&socks_params.user))
|
|
|
.await?;
|
|
|
let (rd, wr) = stream.into_inner().into_split();
|
|
|
- read_socket_updater
|
|
|
- .send(rd)
|
|
|
- .expect("writer: Channel to reader closed");
|
|
|
+ read_socket_updater.send(rd);
|
|
|
return Ok(wr);
|
|
|
} else if let Err(e) = connection_attempt {
|
|
|
let e: MessengerError = e.into();
|
|
@@ -300,10 +291,10 @@ async fn writer<'a>(
|
|
|
stream.write_all(&mgen::serialize_str(&socks_params.user)).await?;
|
|
|
|
|
|
let (rd, wr) = stream.into_inner().into_split();
|
|
|
- read_socket_updater.send(rd).expect("writer: Channel to reader closed");
|
|
|
+ read_socket_updater.send(rd);
|
|
|
Ok(wr)
|
|
|
},
|
|
|
- stream = write_socket_updater.recv() => Ok(stream.expect("writer: Channel from listener closed")),
|
|
|
+ stream = write_socket_updater.recv() => Ok(stream),
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -421,9 +412,9 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
|
HashMap::new();
|
|
|
|
|
|
for (recipient, for_io) in recipient_map.drain() {
|
|
|
- let (listener_writer_to_reader, reader_from_listener_writer) =
|
|
|
- mpsc::unbounded_channel();
|
|
|
- let (listener_to_writer, writer_from_listener) = mpsc::unbounded_channel();
|
|
|
+ let (listener_writer_to_reader, reader_from_listener_writer) = Updater::channel();
|
|
|
+ let listener_writer_to_reader = Arc::new(listener_writer_to_reader);
|
|
|
+ let (listener_to_writer, writer_from_listener) = Updater::channel();
|
|
|
name_to_io_threads.insert(
|
|
|
recipient.to_string(),
|
|
|
(listener_writer_to_reader.clone(), listener_to_writer),
|