mirror of
https://github.com/tun2proxy/tun2proxy.git
synced 2025-04-23 07:19:08 +00:00
ctrl-c memory leak issues
This commit is contained in:
parent
6169014564
commit
aa46971c47
2 changed files with 29 additions and 28 deletions
|
@ -10,7 +10,7 @@ crate-type = ["cdylib", "lib"]
|
|||
[dependencies]
|
||||
base64 = { version = "0.21" }
|
||||
clap = { version = "4.4", features = ["derive"] }
|
||||
ctrlc = "3.4"
|
||||
ctrlc = { git = "https://github.com/ssrlive/rust-ctrlc.git", branch = "master" }
|
||||
digest_auth = "0.3"
|
||||
dotenvy = "0.15"
|
||||
env_logger = "0.10"
|
||||
|
|
|
@ -1134,53 +1134,50 @@ impl<'a> TunToProxy<'a> {
|
|||
}
|
||||
|
||||
#[cfg(any(target_os = "linux", target_os = "macos"))]
|
||||
fn prepare_exiting_signal_trigger(&mut self) -> Result<()> {
|
||||
fn prepare_exiting_signal_trigger(&mut self) -> Result<std::thread::JoinHandle<()>> {
|
||||
let mut exit_trigger = self.exit_trigger.take().ok_or("Already running")?;
|
||||
ctrlc::set_handler(move || {
|
||||
let mut count = 0;
|
||||
loop {
|
||||
match exit_trigger.write(b"EXIT") {
|
||||
Ok(_) => {
|
||||
log::trace!("Exit signal triggered successfully");
|
||||
break;
|
||||
}
|
||||
Err(err) if err.kind() == std::io::ErrorKind::WouldBlock => {
|
||||
if count > 5 {
|
||||
log::error!("Send exit signal failed 5 times, exit anyway");
|
||||
std::process::exit(1);
|
||||
}
|
||||
log::trace!("Send exit signal failed, retry in 1 second");
|
||||
std::thread::sleep(std::time::Duration::from_secs(1));
|
||||
count += 1;
|
||||
}
|
||||
Err(err) => {
|
||||
log::error!("Failed to send exit signal: \"{}\"", err);
|
||||
break;
|
||||
let mut count = 0;
|
||||
let handle = ctrlc::set_handler(move || -> bool {
|
||||
match exit_trigger.write(b"EXIT") {
|
||||
Ok(_) => {
|
||||
log::trace!("Exit signal triggered successfully");
|
||||
true
|
||||
}
|
||||
Err(err) if err.kind() == std::io::ErrorKind::WouldBlock => {
|
||||
if count > 5 {
|
||||
log::error!("Send exit signal failed 5 times, exit anyway");
|
||||
return true; // std::process::exit(1);
|
||||
}
|
||||
count += 1;
|
||||
false
|
||||
}
|
||||
Err(err) => {
|
||||
log::error!("Failed to send exit signal: \"{}\"", err);
|
||||
true
|
||||
}
|
||||
}
|
||||
})?;
|
||||
Ok(())
|
||||
Ok(handle)
|
||||
}
|
||||
|
||||
pub fn run(&mut self) -> Result<(), Error> {
|
||||
#[cfg(any(target_os = "linux", target_os = "macos"))]
|
||||
self.prepare_exiting_signal_trigger()?;
|
||||
let handle = self.prepare_exiting_signal_trigger()?;
|
||||
|
||||
let mut events = Events::with_capacity(1024);
|
||||
loop {
|
||||
let ret = 'exit_point: loop {
|
||||
if let Err(err) = self.poll.poll(&mut events, None) {
|
||||
if err.kind() == std::io::ErrorKind::Interrupted {
|
||||
log::debug!("Poll interrupted: \"{err}\", ignored, continue polling");
|
||||
continue;
|
||||
}
|
||||
return Err(err.into());
|
||||
break 'exit_point Err(Error::from(err));
|
||||
}
|
||||
for event in events.iter() {
|
||||
match event.token() {
|
||||
EXIT_TOKEN => {
|
||||
if self.exiting_event_handler()? {
|
||||
return Ok(());
|
||||
break 'exit_point Ok(());
|
||||
}
|
||||
}
|
||||
EXIT_TRIGGER_TOKEN => {
|
||||
|
@ -1195,7 +1192,11 @@ impl<'a> TunToProxy<'a> {
|
|||
self.send_to_smoltcp()?;
|
||||
self.clearup_expired_udp_associate()?;
|
||||
self.clearup_expired_dns_over_tcp()?;
|
||||
}
|
||||
};
|
||||
#[cfg(any(target_os = "linux", target_os = "macos"))]
|
||||
handle.join().unwrap();
|
||||
log::trace!("{:?}", ret);
|
||||
ret
|
||||
}
|
||||
|
||||
#[cfg(target_family = "unix")]
|
||||
|
|
Loading…
Add table
Reference in a new issue