From b7ca43be33ee447ba78653a3801dd9062c9bc709 Mon Sep 17 00:00:00 2001 From: Artlef Date: Sat, 7 Mar 2020 22:46:40 +0100 Subject: [PATCH] Use channel for server messages in client threads --- src/bin/client.rs | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index dce6d04..714c06b 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -7,6 +7,7 @@ use shakmaty::{Chess, Color, Outcome, Position, Setup}; use std::io; use std::os::unix::net::UnixStream; use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::mpsc::{channel, Receiver, TryRecvError}; use std::sync::{Arc, Mutex}; use std::thread; use std::time; @@ -16,7 +17,7 @@ struct Client { side: Color, running: Arc, input_buffer: Arc>, - server_message: Arc>, + server_message_recv: Receiver, } fn main() { @@ -38,7 +39,7 @@ fn main() { clichess::write_to_stream(&mut stream, username_pubkey_json.to_string()).unwrap(); let input_buffer = setup_input_buffer(); //start a thread to listen to server messages - let server_message = setup_server_message_recv(&stream).unwrap(); + let server_message_recv = setup_server_message_recv(&stream).unwrap(); let mut client = Client { player: clichess::Player { @@ -49,7 +50,7 @@ fn main() { side: Color::White, running: running.clone(), input_buffer: input_buffer.clone(), - server_message: server_message.clone(), + server_message_recv, }; match prompt_user_for_role(&client, &mut stream) { @@ -139,9 +140,9 @@ fn setupctrlc() -> Arc { running } -fn setup_server_message_recv(stream: &UnixStream) -> io::Result>> { +fn setup_server_message_recv(stream: &UnixStream) -> io::Result> { let buf = Arc::new(Mutex::new(String::new())); - let buf2 = buf.clone(); + let (sender, receiver) = channel(); let thread_stream = stream.try_clone()?; thread::spawn(move || { @@ -149,17 +150,10 @@ fn setup_server_message_recv(stream: &UnixStream) -> io::Result String { @@ -203,13 +197,14 @@ fn fetch_message_from_server(client: &Client) -> String { while client.running.load(Ordering::SeqCst) { thread::sleep(time::Duration::from_millis(10)); { - let mut server_response = client.server_message.lock().unwrap(); - if server_response.is_empty() { - continue; - } else { - response = server_response.clone(); - server_response.clear(); - break; + let server_response_recv = &client.server_message_recv; + match server_response_recv.try_recv() { + Ok(msg) => { + response = msg; + break; + } + Err(TryRecvError::Disconnected) => println!("Error: server disconnected."), + Err(TryRecvError::Empty) => continue, } } }