diff --git a/src/server/client.rs b/src/server/client.rs index 7d3349d..643323c 100644 --- a/src/server/client.rs +++ b/src/server/client.rs @@ -23,12 +23,21 @@ use super::backend::*; use super::car::*; use super::packet::*; -static ATOMIC_ID_COUNTER: AtomicU8 = AtomicU8::new(0); - lazy_static! { + pub static ref FREE_IDS: Mutex> = Mutex::new((0..=255).collect()); pub static ref CLIENT_MOD_PROGRESS: Mutex> = Mutex::new(HashMap::new()); } +async fn claim_id() -> u8 { + let mut lock = FREE_IDS.lock().await; + lock.remove(0) // This can panic when we run out of IDs! +} + +async fn free_id(id: u8) { + let mut lock = FREE_IDS.lock().await; + lock.push(id); +} + #[derive(PartialEq)] pub enum ClientState { None, @@ -63,13 +72,14 @@ pub struct Client { impl Drop for Client { fn drop(&mut self) { + tokio::spawn(free_id(self.id)); self.write_runtime.abort(); } } impl Client { - pub fn new(socket: TcpStream) -> Self { - let id = ATOMIC_ID_COUNTER.fetch_add(1, Ordering::SeqCst); + pub async fn new(socket: TcpStream) -> Self { + let id = claim_id().await; trace!("Client with ID #{} created!", id); let (read_half, write_half) = socket.into_split(); diff --git a/src/server/mod.rs b/src/server/mod.rs index 939cbfc..dde5435 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -188,7 +188,7 @@ impl Server { match code as char { 'C' => { - let mut client = Client::new(socket); + let mut client = Client::new(socket).await; match client.authenticate(&cfg_ref).await { Ok(is_client) if is_client => { let mut lock = ci_ref