diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-04-06 20:48:15 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-06 20:48:15 +0200 |
| commit | 9c116d48765ae9c567a9588e64995c404c9c26ab (patch) | |
| tree | a65da0e2a48b5f1f02e963c87edf8515851255ac /mumd/src/network/tcp.rs | |
| parent | 06a765afc73ec1f8f2af27f4ea2730ddaaf05852 (diff) | |
| parent | e01383af1c417666d42a802e44a1d1e98bbcf14e (diff) | |
| download | mum-9c116d48765ae9c567a9588e64995c404c9c26ab.tar.gz | |
Merge pull request #82 from rbran/main
Diffstat (limited to 'mumd/src/network/tcp.rs')
| -rw-r--r-- | mumd/src/network/tcp.rs | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/mumd/src/network/tcp.rs b/mumd/src/network/tcp.rs index 6402a89..02477dc 100644 --- a/mumd/src/network/tcp.rs +++ b/mumd/src/network/tcp.rs @@ -13,7 +13,7 @@ use mumble_protocol::{Clientbound, Serverbound}; use std::collections::HashMap; use std::convert::{Into, TryInto}; use std::net::SocketAddr; -use std::sync::Arc; +use std::sync::{Arc, RwLock}; use tokio::net::TcpStream; use tokio::sync::{mpsc, watch, Mutex}; use tokio::time::{self, Duration}; @@ -79,7 +79,7 @@ impl TcpEventQueue { } pub async fn handle( - state: Arc<Mutex<State>>, + state: Arc<RwLock<State>>, mut connection_info_receiver: watch::Receiver<Option<ConnectionInfo>>, crypt_state_sender: mpsc::Sender<ClientCryptState>, packet_sender: mpsc::UnboundedSender<ControlPacket<Serverbound>>, @@ -103,13 +103,17 @@ pub async fn handle( .await?; // Handshake (omitting `Version` message for brevity) - let state_lock = state.lock().await; - let username = state_lock.username().unwrap().to_string(); - let password = state_lock.password().map(|x| x.to_string()); + let (username, password) = { + let state_lock = state.read().unwrap(); + (state_lock.username().unwrap().to_string(), + state_lock.password().map(|x| x.to_string())) + }; authenticate(&mut sink, username, password).await?; - let phase_watcher = state_lock.phase_receiver(); - let input_receiver = state_lock.audio().input_receiver(); - drop(state_lock); + let (phase_watcher, input_receiver) = { + let state_lock = state.read().unwrap(); + (state_lock.phase_receiver(), + state_lock.audio().input_receiver()) + }; let event_queue = TcpEventQueue::new(); info!("Logging in..."); @@ -241,7 +245,7 @@ async fn send_voice( } async fn listen( - state: Arc<Mutex<State>>, + state: Arc<RwLock<State>>, mut stream: TcpReceiver, crypt_state_sender: mpsc::Sender<ClientCryptState>, event_queue: TcpEventQueue, @@ -260,7 +264,7 @@ async fn listen( // We end up here if the login was rejected. We probably want // to exit before that. warn!("TCP stream gone"); - state.lock().await.broadcast_phase(StatePhase::Disconnected); + state.read().unwrap().broadcast_phase(StatePhase::Disconnected); break; } }; @@ -299,7 +303,7 @@ async fn listen( .await; } event_queue.resolve(TcpEventData::Connected(Ok(&msg))).await; - let mut state = state.lock().await; + let mut state = state.write().unwrap(); let server = state.server_mut().unwrap(); server.parse_server_sync(*msg); match &server.welcome_text { @@ -323,24 +327,24 @@ async fn listen( } } ControlPacket::UserState(msg) => { - state.lock().await.parse_user_state(*msg); + state.write().unwrap().parse_user_state(*msg); } ControlPacket::UserRemove(msg) => { - state.lock().await.remove_client(*msg); + state.write().unwrap().remove_client(*msg); } ControlPacket::ChannelState(msg) => { debug!("Channel state received"); state - .lock() - .await + .write() + .unwrap() .server_mut() .unwrap() .parse_channel_state(*msg); //TODO parse initial if initial } ControlPacket::ChannelRemove(msg) => { state - .lock() - .await + .write() + .unwrap() .server_mut() .unwrap() .parse_channel_remove(*msg); @@ -356,8 +360,8 @@ async fn listen( .. } => { state - .lock() - .await + .read() + .unwrap() .audio() .decode_packet_payload( VoiceStreamType::TCP, |
