|
|
@ -10,18 +10,18 @@ use tokio::{
|
|
|
|
task::{JoinError, JoinHandle},
|
|
|
|
task::{JoinError, JoinHandle},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/// Holds state related to multiple clients managed by a server
|
|
|
|
/// Holds state related to multiple connections managed by a server
|
|
|
|
#[derive(Default)]
|
|
|
|
#[derive(Default)]
|
|
|
|
pub struct State {
|
|
|
|
pub struct State {
|
|
|
|
/// Map of all processes running on the server
|
|
|
|
/// Map of all processes running on the server
|
|
|
|
pub processes: HashMap<usize, Process>,
|
|
|
|
pub processes: HashMap<usize, Process>,
|
|
|
|
|
|
|
|
|
|
|
|
/// List of processes that will be killed when a client drops
|
|
|
|
/// List of processes that will be killed when a connection drops
|
|
|
|
client_processes: HashMap<usize, Vec<usize>>,
|
|
|
|
client_processes: HashMap<usize, Vec<usize>>,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl State {
|
|
|
|
impl State {
|
|
|
|
/// Pushes a new process associated with a client
|
|
|
|
/// Pushes a new process associated with a connection
|
|
|
|
pub fn push_process(&mut self, conn_id: usize, process: Process) {
|
|
|
|
pub fn push_process(&mut self, conn_id: usize, process: Process) {
|
|
|
|
self.client_processes
|
|
|
|
self.client_processes
|
|
|
|
.entry(conn_id)
|
|
|
|
.entry(conn_id)
|
|
|
@ -30,6 +30,16 @@ impl State {
|
|
|
|
self.processes.insert(process.id, process);
|
|
|
|
self.processes.insert(process.id, process);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Removes a process associated with a connection
|
|
|
|
|
|
|
|
pub fn remove_process(&mut self, conn_id: usize, proc_id: usize) {
|
|
|
|
|
|
|
|
self.client_processes.entry(conn_id).and_modify(|v| {
|
|
|
|
|
|
|
|
if let Some(pos) = v.iter().position(|x| *x == proc_id) {
|
|
|
|
|
|
|
|
v.remove(pos);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
self.processes.remove(&proc_id);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Closes stdin for all processes associated with the connection
|
|
|
|
/// Closes stdin for all processes associated with the connection
|
|
|
|
pub fn close_stdin_for_connection(&mut self, conn_id: usize) {
|
|
|
|
pub fn close_stdin_for_connection(&mut self, conn_id: usize) {
|
|
|
|
debug!("<Conn @ {:?}> Closing stdin to all processes", conn_id);
|
|
|
|
debug!("<Conn @ {:?}> Closing stdin to all processes", conn_id);
|
|
|
|