mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Rollup merge of #137463 - sunshowers:illumos-posix-spawn, r=Mark-Simulacrum
[illumos] attempt to use posix_spawn to spawn processes illumos has `posix_spawn`, and the very newest versions also have `_addchdir`, so use that. POSIX standardized this function so I also added a weak symbol lookup for the non `_np` version. (illumos has both.) This probably also works on Solaris, but I don't have access to an installation to validate this so I decided to focus on illumos instead. This is a nice ~4x performance improvement for process creation. My go-to as usual is nextest against the clap repo, which acts as a stress test for process creation -- with [this commit]: ```console $ cargo nextest run -E 'not test(ui_tests) and not test(example_tests)' before: Summary [ 1.747s] 879 tests run: 879 passed, 2 skipped after: Summary [ 0.445s] 879 tests run: 879 passed, 2 skipped ``` [this commit]: https://github.com/clap-rs/clap/commit/fde45f9aea766fb8de46e3d46e6575f393c3b6b9
This commit is contained in:
+2
-2
@@ -151,9 +151,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.169"
|
||||
version = "0.2.170"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
|
||||
checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
|
||||
dependencies = [
|
||||
"rustc-std-workspace-core",
|
||||
]
|
||||
|
||||
@@ -35,7 +35,7 @@ miniz_oxide = { version = "0.8.0", optional = true, default-features = false }
|
||||
addr2line = { version = "0.24.0", optional = true, default-features = false }
|
||||
|
||||
[target.'cfg(not(all(windows, target_env = "msvc")))'.dependencies]
|
||||
libc = { version = "0.2.169", default-features = false, features = [
|
||||
libc = { version = "0.2.170", default-features = false, features = [
|
||||
'rustc-dep-of-std',
|
||||
], public = true }
|
||||
|
||||
|
||||
@@ -410,6 +410,7 @@ unsafe fn do_exec(
|
||||
|
||||
#[cfg(not(any(
|
||||
target_os = "freebsd",
|
||||
target_os = "illumos",
|
||||
all(target_os = "linux", target_env = "gnu"),
|
||||
all(target_os = "linux", target_env = "musl"),
|
||||
target_os = "nto",
|
||||
@@ -427,6 +428,7 @@ fn posix_spawn(
|
||||
// directly.
|
||||
#[cfg(any(
|
||||
target_os = "freebsd",
|
||||
target_os = "illumos",
|
||||
all(target_os = "linux", target_env = "gnu"),
|
||||
all(target_os = "linux", target_env = "musl"),
|
||||
target_os = "nto",
|
||||
@@ -584,6 +586,10 @@ unsafe fn retrying_libc_posix_spawnp(
|
||||
fn get_posix_spawn_addchdir() -> Option<PosixSpawnAddChdirFn> {
|
||||
use crate::sys::weak::weak;
|
||||
|
||||
// POSIX.1-2024 standardizes this function:
|
||||
// https://pubs.opengroup.org/onlinepubs/9799919799/functions/posix_spawn_file_actions_addchdir.html.
|
||||
// The _np version is more widely available, though, so try that first.
|
||||
|
||||
weak! {
|
||||
fn posix_spawn_file_actions_addchdir_np(
|
||||
*mut libc::posix_spawn_file_actions_t,
|
||||
@@ -591,7 +597,16 @@ fn posix_spawn_file_actions_addchdir_np(
|
||||
) -> libc::c_int
|
||||
}
|
||||
|
||||
posix_spawn_file_actions_addchdir_np.get()
|
||||
weak! {
|
||||
fn posix_spawn_file_actions_addchdir(
|
||||
*mut libc::posix_spawn_file_actions_t,
|
||||
*const libc::c_char
|
||||
) -> libc::c_int
|
||||
}
|
||||
|
||||
posix_spawn_file_actions_addchdir_np
|
||||
.get()
|
||||
.or_else(|| posix_spawn_file_actions_addchdir.get())
|
||||
}
|
||||
|
||||
/// Get the function pointer for adding a chdir action to a
|
||||
|
||||
Reference in New Issue
Block a user