mirror of
https://github.com/denoland/deno.git
synced 2024-11-25 15:29:32 -05:00
09204107d8
Fixes #21012 Closes https://github.com/denoland/deno/issues/20855 Fixes https://github.com/denoland/deno/issues/20890 Fixes https://github.com/denoland/deno/issues/20611 Fixes https://github.com/denoland/deno/issues/20336 Fixes `create-svelte` from https://github.com/denoland/deno/issues/17248 Fixes more reports here: - https://github.com/denoland/deno/issues/6529#issuecomment-1432690559 - https://github.com/denoland/deno/issues/6529#issuecomment-1522059006 - https://github.com/denoland/deno/issues/6529#issuecomment-1695803570
69 lines
1.8 KiB
Rust
69 lines
1.8 KiB
Rust
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
|
|
/// Raise soft file descriptor limit to hard file descriptor limit.
|
|
/// This is the difference between `ulimit -n` and `ulimit -n -H`.
|
|
pub fn raise_fd_limit() {
|
|
#[cfg(unix)]
|
|
// TODO(bartlomieju):
|
|
#[allow(clippy::undocumented_unsafe_blocks)]
|
|
unsafe {
|
|
let mut limits = libc::rlimit {
|
|
rlim_cur: 0,
|
|
rlim_max: 0,
|
|
};
|
|
|
|
if 0 != libc::getrlimit(libc::RLIMIT_NOFILE, &mut limits) {
|
|
return;
|
|
}
|
|
|
|
if limits.rlim_cur == libc::RLIM_INFINITY {
|
|
return;
|
|
}
|
|
|
|
// No hard limit? Do a binary search for the effective soft limit.
|
|
if limits.rlim_max == libc::RLIM_INFINITY {
|
|
let mut min = limits.rlim_cur;
|
|
let mut max = 1 << 20;
|
|
|
|
while min + 1 < max {
|
|
limits.rlim_cur = min + (max - min) / 2;
|
|
match libc::setrlimit(libc::RLIMIT_NOFILE, &limits) {
|
|
0 => min = limits.rlim_cur,
|
|
_ => max = limits.rlim_cur,
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
// Raise the soft limit to the hard limit.
|
|
if limits.rlim_cur < limits.rlim_max {
|
|
limits.rlim_cur = limits.rlim_max;
|
|
libc::setrlimit(libc::RLIMIT_NOFILE, &limits);
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|