diff options
| author | bors <bors@rust-lang.org> | 2024-02-29 10:28:59 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-02-29 10:28:59 +0000 |
| commit | 71a7b66f20c551f640f2f382bc7e7923ba0a5dab (patch) | |
| tree | 0ff63ff8089489305c644e9e62cb86770bd965fc /library/std/src | |
| parent | d3d145ea1cae47ad392173f890577788117da3d9 (diff) | |
| parent | 698cec8d61b0234bc147a9541b188fc5db11bdcf (diff) | |
| download | rust-71a7b66f20c551f640f2f382bc7e7923ba0a5dab.tar.gz rust-71a7b66f20c551f640f2f382bc7e7923ba0a5dab.zip | |
Auto merge of #121790 - jhpratt:rollup-yocg203, r=jhpratt
Rollup of 10 pull requests Successful merges: - #119748 (Increase visibility of `join_path` and `split_paths`) - #120291 (Have `String` use `SliceIndex` impls from `str`) - #121723 (Two diagnostic things) - #121740 (Changing some attributes to only_local.) - #121745 (Deeply normalize obligations in `refining_impl_trait`) - #121748 (Restore the standard library review rotation to its former glory) - #121768 (Implement unwind safety for Condvar on all platforms ) - #121777 (Fix typo in `rustc_passes/messages.ftl`) - #121778 (Document potential memory leak in unbounded channel) - #121779 (Remove unused diagnostic struct) r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'library/std/src')
| -rw-r--r-- | library/std/src/env.rs | 18 | ||||
| -rw-r--r-- | library/std/src/panic.rs | 6 | ||||
| -rw-r--r-- | library/std/src/sync/mpmc/list.rs | 3 |
3 files changed, 25 insertions, 2 deletions
diff --git a/library/std/src/env.rs b/library/std/src/env.rs index 5bd20ebe208..1f2b8d3007d 100644 --- a/library/std/src/env.rs +++ b/library/std/src/env.rs @@ -258,6 +258,9 @@ fn _var(key: &OsStr) -> Result<String, VarError> { /// None => println!("{key} is not defined in the environment.") /// } /// ``` +/// +/// If expecting a delimited variable (such as `PATH`), [`split_paths`] +/// can be used to separate items. #[must_use] #[stable(feature = "env", since = "1.0.0")] pub fn var_os<K: AsRef<OsStr>>(key: K) -> Option<OsString> { @@ -441,6 +444,16 @@ pub struct SplitPaths<'a> { /// Returns an iterator over the paths contained in `unparsed`. The iterator /// element type is [`PathBuf`]. /// +/// On most Unix platforms, the separator is `:` and on Windows it is `;`. This +/// also performs unquoting on Windows. +/// +/// [`join_paths`] can be used to recombine elements. +/// +/// # Panics +/// +/// This will panic on systems where there is no delimited `PATH` variable, +/// such as UEFI. +/// /// # Examples /// /// ``` @@ -456,6 +469,7 @@ pub struct SplitPaths<'a> { /// None => println!("{key} is not defined in the environment.") /// } /// ``` +#[doc(alias = "PATH")] #[stable(feature = "env", since = "1.0.0")] pub fn split_paths<T: AsRef<OsStr> + ?Sized>(unparsed: &T) -> SplitPaths<'_> { SplitPaths { inner: os_imp::split_paths(unparsed.as_ref()) } @@ -496,7 +510,8 @@ pub struct JoinPathsError { /// /// Returns an [`Err`] (containing an error message) if one of the input /// [`Path`]s contains an invalid character for constructing the `PATH` -/// variable (a double quote on Windows or a colon on Unix). +/// variable (a double quote on Windows or a colon on Unix), or if the system +/// does not have a `PATH`-like variable (e.g. UEFI or WASI). /// /// # Examples /// @@ -550,6 +565,7 @@ pub struct JoinPathsError { /// ``` /// /// [`env::split_paths()`]: split_paths +#[doc(alias = "PATH")] #[stable(feature = "env", since = "1.0.0")] pub fn join_paths<I, T>(paths: I) -> Result<OsString, JoinPathsError> where diff --git a/library/std/src/panic.rs b/library/std/src/panic.rs index 3728d5b64b8..3d576af681e 100644 --- a/library/std/src/panic.rs +++ b/library/std/src/panic.rs @@ -6,7 +6,7 @@ use crate::any::Any; use crate::collections; use crate::panicking; use crate::sync::atomic::{AtomicU8, Ordering}; -use crate::sync::{Mutex, RwLock}; +use crate::sync::{Condvar, Mutex, RwLock}; use crate::thread::Result; #[doc(hidden)] @@ -67,11 +67,15 @@ pub fn panic_any<M: 'static + Any + Send>(msg: M) -> ! { impl<T: ?Sized> UnwindSafe for Mutex<T> {} #[stable(feature = "catch_unwind", since = "1.9.0")] impl<T: ?Sized> UnwindSafe for RwLock<T> {} +#[stable(feature = "catch_unwind", since = "1.9.0")] +impl UnwindSafe for Condvar {} #[stable(feature = "unwind_safe_lock_refs", since = "1.12.0")] impl<T: ?Sized> RefUnwindSafe for Mutex<T> {} #[stable(feature = "unwind_safe_lock_refs", since = "1.12.0")] impl<T: ?Sized> RefUnwindSafe for RwLock<T> {} +#[stable(feature = "unwind_safe_lock_refs", since = "1.12.0")] +impl RefUnwindSafe for Condvar {} // https://github.com/rust-lang/rust/issues/62301 #[stable(feature = "hashbrown", since = "1.36.0")] diff --git a/library/std/src/sync/mpmc/list.rs b/library/std/src/sync/mpmc/list.rs index a1b275112a1..9e7148c716c 100644 --- a/library/std/src/sync/mpmc/list.rs +++ b/library/std/src/sync/mpmc/list.rs @@ -547,6 +547,9 @@ impl<T> Channel<T> { } let mut head = self.head.index.load(Ordering::Acquire); + // The channel may be uninitialized, so we have to swap to avoid overwriting any sender's attempts + // to initalize the first block before noticing that the receivers disconnected. Late allocations + // will be deallocated by the sender in Drop. let mut block = self.head.block.swap(ptr::null_mut(), Ordering::AcqRel); // If we're going to be dropping messages we need to synchronize with initialization |
