deadlock found
This commit is contained in:
parent
e41c006060
commit
37103d4f62
@ -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,
|
||||||
|
@ -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()?;
|
||||||
|
Loading…
Reference in New Issue
Block a user