deadlock found

This commit is contained in:
MeexReay 2024-08-01 01:52:10 +03:00
parent e41c006060
commit 37103d4f62
2 changed files with 58 additions and 4 deletions

View File

@ -101,6 +101,29 @@ impl ProxyEvent {
(status, cancel.load(Ordering::Relaxed)) (status, cancel.load(Ordering::Relaxed))
} }
pub fn player_connecting_ip(
meexprox: MeexProxMutex,
player: PlayerMutex,
ip: String,
) -> (String, bool) {
let ProxyEvent::PlayerConnectingIPEvent {
ip,
player: _,
cancel,
} = MeexProx::trigger_event(
meexprox,
ProxyEvent::PlayerConnectingIPEvent {
ip: ip.clone(),
player,
cancel: AtomicBool::from(false),
},
)
else {
return (ip, false);
};
(ip, cancel.load(Ordering::Relaxed))
}
pub fn player_connecting_server( pub fn player_connecting_server(
meexprox: MeexProxMutex, meexprox: MeexProxMutex,
player: PlayerMutex, player: PlayerMutex,

View File

@ -1,6 +1,6 @@
use super::{EventListener, PlayerForwarding, ProxyConfig, ProxyError, ProxyEvent, ProxyServer}; use super::{EventListener, PlayerForwarding, ProxyConfig, ProxyError, ProxyEvent, ProxyServer};
use derivative::Derivative; use derivative::Derivative;
use log::info; use log::{debug, info};
use rust_mc_proto::{ use rust_mc_proto::{
DataBufferReader, DataBufferWriter, MinecraftConnection, Packet, ProtocolError, Zigzag, DataBufferReader, DataBufferWriter, MinecraftConnection, Packet, ProtocolError, Zigzag,
}; };
@ -107,6 +107,14 @@ impl ProxyPlayer {
server_address: &str, server_address: &str,
server_port: u16, server_port: u16,
) -> Result<(), Box<dyn Error>> { ) -> Result<(), Box<dyn Error>> {
let (ip, cancel) =
ProxyEvent::player_connecting_ip(meexprox.clone(), this.clone(), ip.to_string());
let ip = &ip;
if cancel {
return Ok(());
}
this.lock() this.lock()
.unwrap() .unwrap()
.connection_id .connection_id
@ -141,6 +149,13 @@ impl ProxyPlayer {
server_address: &str, server_address: &str,
server_port: u16, server_port: u16,
) -> Result<(), Box<dyn Error>> { ) -> Result<(), Box<dyn Error>> {
let (server, cancel) =
ProxyEvent::player_connecting_server(meexprox.clone(), this.clone(), server);
if cancel {
return Ok(());
}
this.lock() this.lock()
.unwrap() .unwrap()
.connection_id .connection_id
@ -182,14 +197,21 @@ impl ProxyPlayer {
.fetch_add(1, Ordering::Relaxed); .fetch_add(1, Ordering::Relaxed);
this.lock().unwrap().server_conn.close(); this.lock().unwrap().server_conn.close();
this.lock().unwrap().server_conn =
MinecraftConnection::connect(this.lock().unwrap().server().unwrap().host())?; let server_host = this.lock().unwrap().server().unwrap().host().to_string();
println!("connect");
this.lock().unwrap().server_conn = MinecraftConnection::connect(&server_host)?;
println!("connected");
thread::spawn({ thread::spawn({
let player_forwarding = meexprox.lock().unwrap().config.player_forwarding().clone(); println!("connecting1");
let player_forwarding = meexprox.lock().unwrap().config.player_forwarding().clone(); // deadlock here
println!("connecting2");
let server_address = server_address.to_string(); let server_address = server_address.to_string();
println!("connecting3");
move || { move || {
println!("connecting4");
let _ = ProxyPlayer::connect( let _ = ProxyPlayer::connect(
this, this,
meexprox, meexprox,
@ -561,6 +583,15 @@ impl MeexProx {
Arc::new(AtomicUsize::new(0)), Arc::new(AtomicUsize::new(0)),
))); )));
let (server, cancel) =
ProxyEvent::player_connecting_server(this.clone(), player.clone(), server.clone());
if cancel {
return Ok(());
}
player.lock().unwrap().server = Some(server);
this.lock().unwrap().players.push(player.clone()); this.lock().unwrap().players.push(player.clone());
let mut login_start = client_conn.read_packet()?; let mut login_start = client_conn.read_packet()?;