rewrite std::sync Mutex to tokio

This commit is contained in:
Norbert Morawski 2023-07-08 05:42:38 +02:00
parent a04e3d3299
commit 57b35902ae

View File

@ -2,9 +2,10 @@ use std::collections::HashMap;
use std::env; use std::env;
use std::error::Error; use std::error::Error;
use std::net::SocketAddr; use std::net::SocketAddr;
use std::sync::{Arc, Mutex}; use std::sync::Arc;
use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::{TcpListener, TcpStream}; use tokio::net::{TcpListener, TcpStream};
use tokio::sync::Mutex;
#[tokio::main] #[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> { async fn main() -> Result<(), Box<dyn Error>> {
@ -49,10 +50,10 @@ async fn start_server(addr: &str) -> Result<(), Box<dyn Error>> {
let clients_shared = Arc::clone(&clients); let clients_shared = Arc::clone(&clients);
// Insert client into the shared HashMap // Insert client into the shared HashMap
clients_shared.lock().unwrap().insert(client_addr, username.clone()); clients_shared.lock().await.insert(client_addr, username.clone());
// Clone the HashMap and release the lock // Clone the HashMap and release the lock
let clients_map = clients_shared.lock().unwrap().clone(); let clients_map = clients_shared.lock().await.clone();
// Spawn a new task for each client connection // Spawn a new task for each client connection
tokio::spawn(async move { tokio::spawn(async move {
@ -62,7 +63,7 @@ async fn start_server(addr: &str) -> Result<(), Box<dyn Error>> {
let n = match socket.read(&mut buf).await { let n = match socket.read(&mut buf).await {
Ok(n) if n == 0 => { Ok(n) if n == 0 => {
// Client disconnected // Client disconnected
let username = clients_shared.lock().unwrap().remove(&client_addr).unwrap_or("Unknown".to_string()); let username = clients_shared.lock().await.remove(&client_addr).unwrap_or("Unknown".to_string());
println!("Client {} ({}) disconnected!", username, client_addr); println!("Client {} ({}) disconnected!", username, client_addr);
return; return;
} }