perf: lazy atexit setup (#21053)

`libc::atexit` incurrs 2% dyld cost at startup on macOS. This PR moves
the setup to when the tty mode is changed using op_stdin_set_raw.
This commit is contained in:
Divy Srivastava 2023-11-04 05:00:12 -07:00 committed by GitHub
parent 8acf059ac6
commit 0b75a7169b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 25 deletions

View file

@ -323,7 +323,6 @@ pub(crate) fn unstable_warn_cb(feature: &str) {
pub fn main() {
setup_panic_hook();
util::unix::prepare_stdio();
util::unix::raise_fd_limit();
util::windows::ensure_stdio_open();
#[cfg(windows)]

View file

@ -43,27 +43,3 @@ pub fn raise_fd_limit() {
}
}
}
pub fn prepare_stdio() {
#[cfg(unix)]
// SAFETY: Save current state of stdio and restore it when we exit.
unsafe {
use libc::atexit;
use libc::tcgetattr;
use libc::tcsetattr;
use libc::termios;
let mut termios = std::mem::zeroed::<termios>();
if tcgetattr(libc::STDIN_FILENO, &mut termios) == 0 {
static mut ORIG_TERMIOS: Option<termios> = None;
ORIG_TERMIOS = Some(termios);
extern "C" fn reset_stdio() {
// SAFETY: Reset the stdio state.
unsafe { tcsetattr(libc::STDIN_FILENO, 0, &ORIG_TERMIOS.unwrap()) };
}
atexit(reset_stdio);
}
}
}

View file

@ -118,6 +118,41 @@ fn op_stdin_set_raw(
}
#[cfg(unix)]
{
fn prepare_stdio() {
// SAFETY: Save current state of stdio and restore it when we exit.
unsafe {
use libc::atexit;
use libc::tcgetattr;
use libc::tcsetattr;
use libc::termios;
use once_cell::sync::OnceCell;
// Only save original state once.
static ORIG_TERMIOS: OnceCell<Option<termios>> = OnceCell::new();
ORIG_TERMIOS.get_or_init(|| {
let mut termios = std::mem::zeroed::<termios>();
if tcgetattr(libc::STDIN_FILENO, &mut termios) == 0 {
extern "C" fn reset_stdio() {
// SAFETY: Reset the stdio state.
unsafe {
tcsetattr(
libc::STDIN_FILENO,
0,
&ORIG_TERMIOS.get().unwrap().unwrap(),
)
};
}
atexit(reset_stdio);
return Some(termios);
}
None
});
}
}
prepare_stdio();
let tty_mode_store = state.borrow::<TtyModeStore>().clone();
let previous_mode = tty_mode_store.get(rid);