mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 21:31:04 +00:00
Bug 1817900 - Update once_cell to 1.17.1. r=emilio,supply-chain-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D170447
This commit is contained in:
parent
a94df0877f
commit
0923af6d54
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -3961,9 +3961,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.16.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
|
||||
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
|
||||
|
||||
[[package]]
|
||||
name = "ordered-float"
|
||||
|
@ -1681,6 +1681,11 @@ who = "Mike Hommey <mh+mozilla@glandium.org>"
|
||||
criteria = "safe-to-deploy"
|
||||
delta = "1.13.1 -> 1.16.0"
|
||||
|
||||
[[audits.once_cell]]
|
||||
who = "Mike Hommey <mh+mozilla@glandium.org>"
|
||||
criteria = "safe-to-deploy"
|
||||
delta = "1.16.0 -> 1.17.1"
|
||||
|
||||
[[audits.ordered-float]]
|
||||
who = "Mike Hommey <mh+mozilla@glandium.org>"
|
||||
criteria = "safe-to-deploy"
|
||||
|
@ -1 +1 @@
|
||||
{"files":{"CHANGELOG.md":"f624f016b8fa7e0f3aa46665f9fa7eb9ab46a02743fa14b29b3dad5bb9c57a9e","Cargo.lock":"f21b2f56fe0bd4911048ebeddc572a6ab6be3248a8de5f24f606bc4b96047455","Cargo.toml":"90819aab2f2f2696d640edcd5806293788279adf6b2f22edb04b25b37be82eb4","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"813d262a320611ba874c4b2488256bdb2b4073649616a1471b389d464a704301","bors.toml":"ebd69f714a49dceb8fd10ebadfea6e2767be4732fdef49eddf6239151b4bc78c","examples/bench.rs":"1597a52529f75d6c5ad0b86759a775b1d723dfa810e2016317283b13594219da","examples/bench_acquire.rs":"9f4912ca262194cb55e893c33739c85c2f4868d07905b9dd3238552b6ce8a6e4","examples/bench_vs_lazy_static.rs":"d527294a2e73b53ac5faed8b316dfd1ae2a06adb31384134af21f10ce76333a5","examples/lazy_static.rs":"8bca1b264da21eceb1ccaf30477fc941bc71bedd030f1c6982ed3a7804abfb4f","examples/reentrant_init_deadlocks.rs":"ff84929de27a848e5b155549caa96db5db5f030afca975f8ba3f3da640083001","examples/regex.rs":"4a2e0fb093c7f5bbe0fff8689fc0c670c5334344a1bfda376f5faa98a05d459f","examples/test_synchronization.rs":"88abd5c16275bb2f2d77eaecf369d97681404a77b8edd0021f24bfd377c46be3","src/imp_cs.rs":"888fc76a1f4e55b1ece3ef748b0aa6a47be2d8d928c10f89ae6b4f12330c0e55","src/imp_pl.rs":"cd69042890c25fd3db97a4762abea4b814c961eadaf5d6ed7c7db17a6abd4c5b","src/imp_std.rs":"f13a5bfe08ac02eb0d5a0271cb5be9e8c534a81cddc3253aaca28b69bded8e65","src/lib.rs":"b1f8113fc779d6ea398ddb736fe5b3e3c4a63f23404569e4a08a5003bdd3774f","src/race.rs":"bb89ba6fe9420b8d3a173c1a484dde1b6a65289c5d72eb57cd3b0cca3ac23c04","tests/it.rs":"41f50496463a0036c45ed138f158d221d379e50a91ca452ba8ffe8caa7a59e3a"},"package":"86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"}
|
||||
{"files":{"CHANGELOG.md":"0cc0b7a536c63969dfe9a3482ad35be72368ae10bcb38522375ab1956f1d34d8","Cargo.lock":"8a37d0df9b1582a7f19959e9c7076de4e94bbf14d4a8cc993482cac1817ccd11","Cargo.toml":"0c350a2582981f0096c51368eba98e2ae554c523542322d06d58943d1883c346","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"e883909b29dc4d1c44270136fe2cfe7b2df6b416226b13928fdf9f1e15130be7","bors.toml":"ebd69f714a49dceb8fd10ebadfea6e2767be4732fdef49eddf6239151b4bc78c","examples/bench.rs":"1597a52529f75d6c5ad0b86759a775b1d723dfa810e2016317283b13594219da","examples/bench_acquire.rs":"9f4912ca262194cb55e893c33739c85c2f4868d07905b9dd3238552b6ce8a6e4","examples/bench_vs_lazy_static.rs":"d527294a2e73b53ac5faed8b316dfd1ae2a06adb31384134af21f10ce76333a5","examples/lazy_static.rs":"8bca1b264da21eceb1ccaf30477fc941bc71bedd030f1c6982ed3a7804abfb4f","examples/reentrant_init_deadlocks.rs":"ff84929de27a848e5b155549caa96db5db5f030afca975f8ba3f3da640083001","examples/regex.rs":"4a2e0fb093c7f5bbe0fff8689fc0c670c5334344a1bfda376f5faa98a05d459f","examples/test_synchronization.rs":"88abd5c16275bb2f2d77eaecf369d97681404a77b8edd0021f24bfd377c46be3","src/imp_cs.rs":"888fc76a1f4e55b1ece3ef748b0aa6a47be2d8d928c10f89ae6b4f12330c0e55","src/imp_pl.rs":"cd69042890c25fd3db97a4762abea4b814c961eadaf5d6ed7c7db17a6abd4c5b","src/imp_std.rs":"f13a5bfe08ac02eb0d5a0271cb5be9e8c534a81cddc3253aaca28b69bded8e65","src/lib.rs":"1458bb31d52c5c79d61077c8adb042afedab295a1744def7aa591bbbf005d1ba","src/race.rs":"eb977c7caed88774699fea6ac25afdfde0bad211c7a20c64a06dabcdc38e8a29","tests/it.rs":"41f50496463a0036c45ed138f158d221d379e50a91ca452ba8ffe8caa7a59e3a"},"package":"b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"}
|
8
third_party/rust/once_cell/CHANGELOG.md
vendored
8
third_party/rust/once_cell/CHANGELOG.md
vendored
@ -4,6 +4,14 @@
|
||||
|
||||
-
|
||||
|
||||
## 1.17.1
|
||||
|
||||
- Make `OnceRef` implementation compliant with [strict provenance](https://github.com/rust-lang/rust/issues/95228).
|
||||
|
||||
## 1.17.0
|
||||
|
||||
- Add `race::OnceRef` for storing a `&'a T`.
|
||||
|
||||
## 1.16.0
|
||||
|
||||
- Add `no_std` implementation based on `critical-section`,
|
||||
|
2
third_party/rust/once_cell/Cargo.lock
generated
vendored
2
third_party/rust/once_cell/Cargo.lock
generated
vendored
@ -74,7 +74,7 @@ checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0"
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.16.0"
|
||||
version = "1.17.1"
|
||||
dependencies = [
|
||||
"atomic-polyfill",
|
||||
"critical-section",
|
||||
|
2
third_party/rust/once_cell/Cargo.toml
vendored
2
third_party/rust/once_cell/Cargo.toml
vendored
@ -13,7 +13,7 @@
|
||||
edition = "2021"
|
||||
rust-version = "1.56"
|
||||
name = "once_cell"
|
||||
version = "1.16.0"
|
||||
version = "1.17.1"
|
||||
authors = ["Aleksey Kladov <aleksey.kladov@gmail.com>"]
|
||||
exclude = [
|
||||
"*.png",
|
||||
|
2
third_party/rust/once_cell/README.md
vendored
2
third_party/rust/once_cell/README.md
vendored
@ -51,6 +51,8 @@ More patterns and use-cases are in the [docs](https://docs.rs/once_cell/)!
|
||||
* [lazycell](https://crates.io/crates/lazycell)
|
||||
* [mitochondria](https://crates.io/crates/mitochondria)
|
||||
* [lazy_static](https://crates.io/crates/lazy_static)
|
||||
* [async_once_cell](https://crates.io/crates/async_once_cell)
|
||||
* [generic_once_cell](https://crates.io/crates/generic_once_cell) (bring your own mutex)
|
||||
|
||||
The API of `once_cell` is being proposed for inclusion in
|
||||
[`std`](https://github.com/rust-lang/rfcs/pull/2788).
|
||||
|
19
third_party/rust/once_cell/src/lib.rs
vendored
19
third_party/rust/once_cell/src/lib.rs
vendored
@ -208,7 +208,6 @@
|
||||
//! ```
|
||||
//! use once_cell::sync::OnceCell;
|
||||
//!
|
||||
//! #[derive(Debug)]
|
||||
//! pub struct LateInit<T> { cell: OnceCell<T> }
|
||||
//!
|
||||
//! impl<T> LateInit<T> {
|
||||
@ -228,22 +227,24 @@
|
||||
//! }
|
||||
//! }
|
||||
//!
|
||||
//! #[derive(Default, Debug)]
|
||||
//! #[derive(Default)]
|
||||
//! struct A<'a> {
|
||||
//! b: LateInit<&'a B<'a>>,
|
||||
//! }
|
||||
//!
|
||||
//! #[derive(Default, Debug)]
|
||||
//! #[derive(Default)]
|
||||
//! struct B<'a> {
|
||||
//! a: LateInit<&'a A<'a>>
|
||||
//! }
|
||||
//!
|
||||
//!
|
||||
//! fn build_cycle() {
|
||||
//! let a = A::default();
|
||||
//! let b = B::default();
|
||||
//! a.b.init(&b);
|
||||
//! b.a.init(&a);
|
||||
//! println!("{:?}", a.b.a.b.a);
|
||||
//!
|
||||
//! let _a = &a.b.a.b.a;
|
||||
//! }
|
||||
//! ```
|
||||
//!
|
||||
@ -315,6 +316,10 @@
|
||||
//!
|
||||
//! No, but you can use [`async_once_cell`](https://crates.io/crates/async_once_cell) instead.
|
||||
//!
|
||||
//! **Can I bring my own mutex?**
|
||||
//!
|
||||
//! There is [generic_once_cell](https://crates.io/crates/generic_once_cell) to allow just that.
|
||||
//!
|
||||
//! # Related crates
|
||||
//!
|
||||
//! * [double-checked-cell](https://github.com/niklasf/double-checked-cell)
|
||||
@ -323,6 +328,7 @@
|
||||
//! * [mitochondria](https://crates.io/crates/mitochondria)
|
||||
//! * [lazy_static](https://crates.io/crates/lazy_static)
|
||||
//! * [async_once_cell](https://crates.io/crates/async_once_cell)
|
||||
//! * [generic_once_cell](https://crates.io/crates/generic_once_cell) (bring your own mutex)
|
||||
//!
|
||||
//! Most of this crate's functionality is available in `std` in nightly Rust.
|
||||
//! See the [tracking issue](https://github.com/rust-lang/rust/issues/74465).
|
||||
@ -448,7 +454,10 @@ pub mod unsync {
|
||||
/// Returns `None` if the cell is empty.
|
||||
#[inline]
|
||||
pub fn get(&self) -> Option<&T> {
|
||||
// Safe due to `inner`'s invariant
|
||||
// Safe due to `inner`'s invariant of being written to at most once.
|
||||
// Had multiple writes to `inner` been allowed, a reference to the
|
||||
// value we return now would become dangling by a write of a
|
||||
// different value later.
|
||||
unsafe { &*self.inner.get() }.as_ref()
|
||||
}
|
||||
|
||||
|
117
third_party/rust/once_cell/src/race.rs
vendored
117
third_party/rust/once_cell/src/race.rs
vendored
@ -24,8 +24,11 @@ use atomic_polyfill as atomic;
|
||||
#[cfg(not(feature = "critical-section"))]
|
||||
use core::sync::atomic;
|
||||
|
||||
use atomic::{AtomicUsize, Ordering};
|
||||
use atomic::{AtomicPtr, AtomicUsize, Ordering};
|
||||
use core::cell::UnsafeCell;
|
||||
use core::marker::PhantomData;
|
||||
use core::num::NonZeroUsize;
|
||||
use core::ptr;
|
||||
|
||||
/// A thread-safe cell which can be written to only once.
|
||||
#[derive(Default, Debug)]
|
||||
@ -172,6 +175,118 @@ impl OnceBool {
|
||||
}
|
||||
}
|
||||
|
||||
/// A thread-safe cell which can be written to only once.
|
||||
pub struct OnceRef<'a, T> {
|
||||
inner: AtomicPtr<T>,
|
||||
ghost: PhantomData<UnsafeCell<&'a T>>,
|
||||
}
|
||||
|
||||
// TODO: Replace UnsafeCell with SyncUnsafeCell once stabilized
|
||||
unsafe impl<'a, T: Sync> Sync for OnceRef<'a, T> {}
|
||||
|
||||
impl<'a, T> core::fmt::Debug for OnceRef<'a, T> {
|
||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||
write!(f, "OnceRef({:?})", self.inner)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> Default for OnceRef<'a, T> {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> OnceRef<'a, T> {
|
||||
/// Creates a new empty cell.
|
||||
pub const fn new() -> OnceRef<'a, T> {
|
||||
OnceRef { inner: AtomicPtr::new(ptr::null_mut()), ghost: PhantomData }
|
||||
}
|
||||
|
||||
/// Gets a reference to the underlying value.
|
||||
pub fn get(&self) -> Option<&'a T> {
|
||||
let ptr = self.inner.load(Ordering::Acquire);
|
||||
unsafe { ptr.as_ref() }
|
||||
}
|
||||
|
||||
/// Sets the contents of this cell to `value`.
|
||||
///
|
||||
/// Returns `Ok(())` if the cell was empty and `Err(value)` if it was
|
||||
/// full.
|
||||
pub fn set(&self, value: &'a T) -> Result<(), ()> {
|
||||
let ptr = value as *const T as *mut T;
|
||||
let exchange =
|
||||
self.inner.compare_exchange(ptr::null_mut(), ptr, Ordering::AcqRel, Ordering::Acquire);
|
||||
match exchange {
|
||||
Ok(_) => Ok(()),
|
||||
Err(_) => Err(()),
|
||||
}
|
||||
}
|
||||
|
||||
/// Gets the contents of the cell, initializing it with `f` if the cell was
|
||||
/// empty.
|
||||
///
|
||||
/// If several threads concurrently run `get_or_init`, more than one `f` can
|
||||
/// be called. However, all threads will return the same value, produced by
|
||||
/// some `f`.
|
||||
pub fn get_or_init<F>(&self, f: F) -> &'a T
|
||||
where
|
||||
F: FnOnce() -> &'a T,
|
||||
{
|
||||
enum Void {}
|
||||
match self.get_or_try_init(|| Ok::<&'a T, Void>(f())) {
|
||||
Ok(val) => val,
|
||||
Err(void) => match void {},
|
||||
}
|
||||
}
|
||||
|
||||
/// Gets the contents of the cell, initializing it with `f` if
|
||||
/// the cell was empty. If the cell was empty and `f` failed, an
|
||||
/// error is returned.
|
||||
///
|
||||
/// If several threads concurrently run `get_or_init`, more than one `f` can
|
||||
/// be called. However, all threads will return the same value, produced by
|
||||
/// some `f`.
|
||||
pub fn get_or_try_init<F, E>(&self, f: F) -> Result<&'a T, E>
|
||||
where
|
||||
F: FnOnce() -> Result<&'a T, E>,
|
||||
{
|
||||
let mut ptr = self.inner.load(Ordering::Acquire);
|
||||
|
||||
if ptr.is_null() {
|
||||
// TODO replace with `cast_mut` when MSRV reaches 1.65.0 (also in `set`)
|
||||
ptr = f()? as *const T as *mut T;
|
||||
let exchange = self.inner.compare_exchange(
|
||||
ptr::null_mut(),
|
||||
ptr,
|
||||
Ordering::AcqRel,
|
||||
Ordering::Acquire,
|
||||
);
|
||||
if let Err(old) = exchange {
|
||||
ptr = old;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(unsafe { &*ptr })
|
||||
}
|
||||
|
||||
/// ```compile_fail
|
||||
/// use once_cell::race::OnceRef;
|
||||
///
|
||||
/// let mut l = OnceRef::new();
|
||||
///
|
||||
/// {
|
||||
/// let y = 2;
|
||||
/// let mut r = OnceRef::new();
|
||||
/// r.set(&y).unwrap();
|
||||
/// core::mem::swap(&mut l, &mut r);
|
||||
/// }
|
||||
///
|
||||
/// // l now contains a dangling reference to y
|
||||
/// eprintln!("uaf: {}", l.get().unwrap());
|
||||
/// ```
|
||||
fn _dummy() {}
|
||||
}
|
||||
|
||||
#[cfg(feature = "alloc")]
|
||||
pub use self::once_box::OnceBox;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user