mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-28 13:53:10 +00:00
fix is_windows_subsystem_for_linux(), check for post-fork-safety
This function only ever returns true if target_os=linux, so we need to invert the OS check. In the first invocation, this function may allocate heap memory. Clarify that this is safe. [ja: I don't have the original commit handy so I made up the log message]
This commit is contained in:
parent
0a48f4b55c
commit
0233c0c437
1 changed files with 24 additions and 11 deletions
|
@ -1659,24 +1659,37 @@ fn slice_contains_slice<T: Eq>(a: &[T], b: &[T]) -> bool {
|
||||||
a.windows(b.len()).any(|aw| aw == b)
|
a.windows(b.len()).any(|aw| aw == b)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
/// Determines if we are running under Microsoft's Windows Subsystem for Linux to work around
|
||||||
static IS_WINDOWS_SUBSYSTEM_FOR_LINUX: once_cell::race::OnceBool = once_cell::race::OnceBool::new();
|
/// some known limitations and/or bugs.
|
||||||
|
///
|
||||||
|
/// See https://github.com/Microsoft/WSL/issues/423 and Microsoft/WSL#2997
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
|
pub fn is_windows_subsystem_for_linux() -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
/// Determines if we are running under Microsoft's Windows Subsystem for Linux to work around
|
/// Determines if we are running under Microsoft's Windows Subsystem for Linux to work around
|
||||||
/// some known limitations and/or bugs.
|
/// some known limitations and/or bugs.
|
||||||
|
///
|
||||||
/// See https://github.com/Microsoft/WSL/issues/423 and Microsoft/WSL#2997
|
/// See https://github.com/Microsoft/WSL/issues/423 and Microsoft/WSL#2997
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
pub fn is_windows_subsystem_for_linux() -> bool {
|
pub fn is_windows_subsystem_for_linux() -> bool {
|
||||||
// We are purposely not using std::call_once as it may invoke locking, which is an unnecessary
|
static RESULT: once_cell::race::OnceBool = once_cell::race::OnceBool::new();
|
||||||
// overhead since there's no actual race condition here - even if multiple threads call this
|
|
||||||
// routine simultaneously the first time around, we just end up needlessly querying uname(2) one
|
// This is called post-fork from [`report_setpgid_error()`], so the fast path must not involve
|
||||||
// more time.
|
// any allocations or mutexes. We can't rely on all the std functions to be alloc-free in both
|
||||||
#[cfg(not(target_os = "linux"))]
|
// Debug and Release modes, so we just mandate that the result already be available.
|
||||||
{
|
//
|
||||||
false
|
// is_wsl() is called by has_working_timestamps() which is called by `screen.cpp` in the main
|
||||||
|
// process. If that's not good enough, we can call is_wsl() manually at shell startup.
|
||||||
|
if crate::threads::is_forked_child() {
|
||||||
|
debug_assert!(
|
||||||
|
RESULT.get().is_some(),
|
||||||
|
"is_wsl() should be called by main before forking!"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
RESULT.get_or_init(|| {
|
||||||
IS_WINDOWS_SUBSYSTEM_FOR_LINUX.get_or_init(|| {
|
|
||||||
let mut info: libc::utsname = unsafe { mem::zeroed() };
|
let mut info: libc::utsname = unsafe { mem::zeroed() };
|
||||||
let release: &[u8] = unsafe {
|
let release: &[u8] = unsafe {
|
||||||
libc::uname(&mut info);
|
libc::uname(&mut info);
|
||||||
|
|
Loading…
Reference in a new issue