ffixing blocking calls in network manager

This commit is contained in:
michael-bailey 2021-03-23 08:29:20 +00:00
parent 77fe320aa7
commit 2dcd6045ae
1 changed files with 44 additions and 3 deletions

View File

@ -1,3 +1,4 @@
use std::sync::Mutex;
use std::collections::VecDeque;
use std::net::TcpStream;
use crate::client::Client;
@ -8,6 +9,8 @@ use std::sync::Arc;
use std::net::TcpListener;
use std::io::Write;
use std::io::BufRead;
use std::io::Read;
use crossbeam_channel::{Sender};
@ -16,7 +19,7 @@ use foundation::messages::network::{NetworkSockIn, NetworkSockOut};
pub struct NetworkManager {
listener: TcpListener,
connection_queue: VecDeque<TcpStream>,
connection_queue: Mutex<VecDeque<TcpStream>>,
server_channel: Sender<ServerMessage>,
}
@ -34,7 +37,7 @@ impl NetworkManager {
Arc::new(NetworkManager {
listener,
connection_queue: VecDeque::new(),
connection_queue: Mutex::new(VecDeque::new()),
server_channel,
})
}
@ -44,6 +47,45 @@ impl ICooperative for NetworkManager {
fn tick(&self) {
println!("[NetworkManager]: Tick!");
// fetch new connections and add them to the client queue
let mut lock = self.connection_queue.lock().unwrap();
for connection in self.listener.incoming() {
match connection {
Ok(stream) => {
&mut lock.push_back(stream);
},
Err(e) => {
println!("[Network manager]: error getting stream: {:?}", e);
},
}
}
drop(lock);
// attempt to handle current connections
let mut buffer = String::new();
let mut lock = self.connection_queue.lock().unwrap();
for i in 1..lock.len() {
let mut stream = lock.pop_front();
if let Some(stream) = stream {
let mut writer = BufWriter::new(stream.try_clone().unwrap());
let mut reader = BufReader::new(stream.try_clone().unwrap());
if let Ok(_) = reader.read_line(&mut buffer) {
println!("recieved");
} else {
continue;
}
}
}
drop(lock);
// get all new connections
// handle each request
println!("[NetworkManager]: handling new connections!");
@ -52,7 +94,6 @@ impl ICooperative for NetworkManager {
Ok(stream) => {
stream.set_nonblocking(false).expect("[NetworkManager]: cant set non-blocking on connection");
// create buffered writers
let mut reader = BufReader::new(stream.try_clone().unwrap());
let mut writer = BufWriter::new(stream.try_clone().unwrap());