aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEskil Queseth <eskilq@kth.se>2021-05-21 15:21:57 +0200
committerEskil Queseth <eskilq@kth.se>2021-05-21 15:21:57 +0200
commit6519ad9c82549817d797a5d9d463a418eb35273f (patch)
treefa15449dc6f52c755f5a43404b901948338af0ed
parentd6779ca065a896d329a7634d69a5f4270d829b73 (diff)
downloadmum-6519ad9c82549817d797a5d9d463a418eb35273f.tar.gz
fix deadlock and change message registering properly
-rw-r--r--mumd/src/network/tcp.rs2
-rw-r--r--mumd/src/state.rs20
2 files changed, 12 insertions, 10 deletions
diff --git a/mumd/src/network/tcp.rs b/mumd/src/network/tcp.rs
index b6e939a..b513797 100644
--- a/mumd/src/network/tcp.rs
+++ b/mumd/src/network/tcp.rs
@@ -299,6 +299,8 @@ async fn listen(
notifications::send(format!("{}: {}", user, msg.get_message())); //TODO: probably want a config flag for this
}
state.register_message((msg.get_message().to_owned(), msg.get_actor()));
+ drop(state);
+ event_queue.resolve(TcpEventData::TextMessage(&*msg));
}
ControlPacket::CryptSetup(msg) => {
debug!("Crypt setup");
diff --git a/mumd/src/state.rs b/mumd/src/state.rs
index 483f915..fba6ab0 100644
--- a/mumd/src/state.rs
+++ b/mumd/src/state.rs
@@ -612,16 +612,6 @@ pub fn handle_command(
}
Command::PastMessages { block } => {
if block {
- let messages = std::mem::take(&mut state.message_buffer);
- let server = match state.server.as_ref() {
- Some(s) => s,
- None => return now!(Err(Error::Disconnected)),
- };
- let messages = messages.into_iter()
- .map(|(msg, user)| (msg, server.users().get(&user).unwrap().name().to_string())).collect();
-
- now!(Ok(Some(CommandResponse::PastMessages { messages })))
- } else {
let ref_state = Arc::clone(&og_state);
ExecutionContext::TcpEventSubscriber(
TcpEvent::TextMessage,
@@ -637,6 +627,16 @@ pub fn handle_command(
}
}),
)
+ } else {
+ let messages = std::mem::take(&mut state.message_buffer);
+ let server = match state.server.as_ref() {
+ Some(s) => s,
+ None => return now!(Err(Error::Disconnected)),
+ };
+ let messages = messages.into_iter()
+ .map(|(msg, user)| (msg, server.users().get(&user).unwrap().name().to_string())).collect();
+
+ now!(Ok(Some(CommandResponse::PastMessages { messages })))
}
}
Command::SendMessage { message, targets } => {