Commit Graph

367 Commits

Author SHA1 Message Date
bors 81b757c670 Auto merge of #100603 - tmandry:zst-guards, r=dtolnay
Optimize away poison guards when std is built with panic=abort

> **Note**: To take advantage of this PR, you will have to use `-Zbuild-std` or build your own toolchain. rustup toolchains always link to a libstd that was compiled with `panic=unwind`, since it's compatible with `panic=abort` code.

When std is compiled with `panic=abort` we can remove a lot of the poison machinery from the locks. This changes the `Flag` and `Guard` types to be ZSTs. It also adds an uninhabited member to `PoisonError` so the compiler knows it can optimize away the `Result::Err` paths, and make `LockResult<T>` layout-equivalent to `T`.

### Is this a breaking change?

`PoisonError::new` now panics if invoked from a libstd built with `panic="abort"` (or any non-`unwind` strategy). It is unclear to me whether to consider this a breaking change.

In order to encounter this behavior, **both of the following must be true**:

#### Using a libstd with `panic="abort"`

This is pretty uncommon. We don't build libstd with that in rustup, except in (Tier 2-3) platforms that do not support unwinding, **most notably wasm**.

Most people who do this are using cargo's `-Z build-std` feature, which is unstable.

`panic="abort"` is not a supported option in Rust's build system. It is possible to configure it using `CARGO_TARGET_xxx_RUSTFLAGS`, but I believe this only works on **non-host** platforms.

#### Creating `PoisonError` manually

This is also unlikely. The only common use case I can think of is in tests, and you can't run tests with `panic="abort"` without the unstable `-Z panic_abort_tests` flag.

It's possible that someone is implementing their own locks using std's `PoisonError` **and** defining "thread failure" to mean something other than "panic". If this is the case then we would break their code if it was used with a `panic="abort"` libstd. The locking crates I know of don't replicate std's poison API, but I haven't done much research into this yet.

I've touched on a fair number of considerations here. Which ones do people consider relevant?
2024-02-14 10:07:01 +00:00
Igor b06f89187b Fix typos in OneLock doc 2024-02-14 07:41:28 +01:00
Mark Rousskov 8043821b3a Bump version placeholders 2024-02-08 07:43:38 -05:00
Behnam Esfahbod a596159dca std: Doc blocking behavior of LazyLock methods 2024-01-14 10:28:13 -08:00
Thayne McCombs 1ed855dedf Stabilize mutex_unpoison feature
Closes #96469

@rustbot +T-libs-api
2024-01-10 02:34:34 -07:00
Jules Bertholet 3c9aa69147 Make Barrier::new() const 2024-01-02 21:42:10 -05:00
bors 84f6130fe3 Auto merge of #118692 - surechen:remove_unused_imports, r=petrochenkov
remove redundant imports

detects redundant imports that can be eliminated.

for #117772 :

In order to facilitate review and modification, split the checking code and removing redundant imports code into two PR.

r? `@petrochenkov`
2023-12-10 11:55:48 +00:00
surechen 40ae34194c remove redundant imports
detects redundant imports that can be eliminated.

for #117772 :

In order to facilitate review and modification, split the checking code and
removing redundant imports code into two PR.
2023-12-10 10:56:22 +08:00
naglis 7d50a39763 Fix typo in std::sync::Mutex example 2023-12-10 02:21:53 +02:00
Ian Rees 88fccc465f OnceLock: Rework example, statics aren't dropped 2023-12-08 09:49:54 +13:00
Zachary S 06ec7a7611 fmt 2023-12-05 18:10:39 -06:00
Zachary S 3ef4b083ac Specify behavior if the closure passed to *Guard::*map panics. 2023-12-05 17:30:46 -06:00
Zachary S 6aebcbee0a fix MappedMutexGuard::(try_)map doc typo. 2023-12-05 17:30:46 -06:00
Zachary S 5533606fe0 Add MappedMutexGuard and MappedRwLock*Guard tests. 2023-12-05 17:30:36 -06:00
Zachary S 20fa3a0d8f Fix Condvar typo, add public re-exports of Mapped*Guard. 2023-12-05 16:39:03 -06:00
Zachary S 04f8630442 Add comment about Mapped(Mutex|RwLockWrite)Guard variance. 2023-12-05 16:37:18 -06:00
Zachary S ea97c1f2dc Implmement MappedRwLock(Read|Write)Guard. 2023-12-05 15:02:05 -06:00
Zachary S 9be1321676 Implement MappedMutexGuard. 2023-12-05 14:50:59 -06:00
Zachary S f842d7b505 Allow cloning poison::Guards.
(makes implementing `Mapped*Guard` easier)
2023-12-05 14:40:40 -06:00
Corey Farwell a8a5704f1b Update OnceLock documentation to give a concrete 'lazy static' example, and expand on existing example. 2023-11-25 16:30:43 -05:00
Zachary S 9e3c9a6840 Add T: ?Sized to RwLock*Guards' Debug impls. 2023-10-24 14:46:27 -05:00
daxpedda 6db2587999 Implement OnceCell/Lock::try_insert() 2023-10-13 14:54:32 +02:00
Peter Hall c95015c295 Minor doc clarification in Once::call_once 2023-10-06 12:20:39 +01:00
Kriskras99 cdf25c904e Replace 'mutex' with 'lock' in RwLock documentation
When copying the documentation for `clear_poison` from Mutex, not every occurence of 'mutex' was replaced with 'lock'.
2023-09-19 12:46:53 +02:00
Ben Schulz a38ea96825 Remove Drop impl of mpsc Receiver and (Sync)Sender 2023-08-18 14:46:20 +02:00
Gurinder Singh 0af9dfc0a3 Update Sender documentation for Sync 2023-08-12 09:20:56 +05:30
Taras Tsugrii a090e97f68 [library/std] Replace condv while loop with cvar.wait_while.
`wait_while` takes care of spurious wake-ups in centralized place,
reducing chances for mistakes and potential future optimizations
(who knows, maybe in future there will be no spurious wake-ups? :)
2023-08-01 22:10:40 -07:00
Matthias Krüger bcfa49f162 Rollup merge of #109318 - joboet:better_fmt_placeholder, r=dtolnay
Make `Debug` representations of `[Lazy, Once]*[Cell, Lock]` consistent with `Mutex` and `RwLock`

`Mutex` prints `<locked>` as a field value when its inner value cannot be accessed, but the lazy types print a fixed string like "`OnceCell(Uninit)`". This could cause confusion if the inner type is a unit type named `Uninit` and does not respect the pretty-printing flag. With this change, the format message is now "`OnceCell(<uninit>)`", consistent with `Mutex`.
2023-07-31 22:51:12 +02:00
Jubilee 0ad8d6adc5 Rollup merge of #109075 - joboet:lazylock_backtrace, r=workingjubilee
Use `LazyLock` to lazily resolve backtraces

By using TAIT to name the initializing closure, `LazyLock` can be used to replace the current `LazilyResolvedCapture`.
2023-07-30 17:50:47 -07:00
yukang d67d9890ae Fix the example in document for WaitTimeoutResult::timed_out 2023-07-30 16:39:33 +08:00
DragonBillow 40dd5a337c docs(LazyLock): add example pass local LazyLock variable to struct
Signed-off-by: DragonBillow <DragonBillow@outlook.com>
2023-07-25 12:21:30 +08:00
Ibraheem Ahmed fb31a1ac21 avoid tls access while iterating through mpsc thread entries 2023-07-19 11:50:29 -04:00
chenx97 d3727148a0 support for mips32r6 as a target_arch value 2023-07-18 18:58:18 +08:00
chenx97 c6e03cd951 support for mips64r6 as a target_arch value 2023-07-18 18:58:18 +08:00
Mark Rousskov 0d93d787ba Replace version placeholder to 1.72 2023-07-12 21:24:05 -04:00
Guilliam Xavier e34ff93c6b std docs: factorize literal in Barrier example 2023-06-30 16:11:30 +02:00
Ibraheem Ahmed 5f56956b3c implement Sync for mpsc::Sender 2023-06-10 19:22:07 -04:00
Tshepang Mbambo 793fa8d7c5 doc: improve explanation 2023-06-01 12:55:58 +02:00
Gil Shoshan af5de855a3 Remove unnecessary Send bound 2023-05-03 15:47:11 +03:00
Pietro Albini 4e04da6183 replace version placeholders 2023-04-28 08:47:55 -07:00
joboet 6776af529a std: use LazyLock to lazily resolve backtraces 2023-04-27 09:32:28 +02:00
Matthias Krüger 9babe98562 Rollup merge of #110419 - jsoref:spelling-library, r=jyn514
Spelling library

Split per https://github.com/rust-lang/rust/pull/110392

I can squash once people are happy w/ the changes. It's really uncommon for large sets of changes to be perfectly acceptable w/o at least some changes.

I probably won't have time to respond until tomorrow or the next day
2023-04-26 18:51:41 +02:00
Josh Soref 9cb9346005 Spelling library/
* advance
* aligned
* borrowed
* calculate
* debugable
* debuggable
* declarations
* desugaring
* documentation
* enclave
* ignorable
* initialized
* iterator
* kaboom
* monomorphization
* nonexistent
* optimizer
* panicking
* process
* reentrant
* rustonomicon
* the
* uninitialized

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
2023-04-26 02:10:22 -04:00
bors fdeef3ed18 Auto merge of #106152 - SUPERCILEX:lazycell, r=Amanieu
Add LazyCell::into_inner

This enables uses cases that need to extract the evaluated value and do something owned with it.
2023-04-24 23:47:32 +00:00
joboet b7e68dfc94 std: make Debug representations of [Lazy, Once]*[Cell, Lock] consistent with Mutex and RwLock
`Mutex` prints `<locked>` as a field value when its inner value cannot be accessed, but the lazy types print a fixed string like "`OnceCell(Uninit)`". This could cause confusion if the inner type is a unit type named `Uninit` and does not respect the pretty-printing flag. With this change, the format message is now "`OnceCell(<uninit>)`", consistent with `Mutex`.
2023-04-19 08:35:22 +02:00
Deadbeef 76dbe29104 rm const traits in libcore 2023-04-16 06:49:27 +00:00
Alex Saveau d9256f94a9 Add Lazy{Cell,Lock}::into_inner
Signed-off-by: Alex Saveau <saveau.alexandre@gmail.com>
2023-04-14 13:15:11 -07:00
Petros Angelatos f0d487dce5 sync::mpsc: synchronize receiver disconnect with initialization
Receiver disconnection relies on the incorrect assumption that
`head.index != tail.index` implies that the channel is initialized (i.e
`head.block` and `tail.block` point to allocated blocks). However, it
can happen that `head.index != tail.index` and `head.block == null` at
the same time which leads to a segfault when a channel is dropped in
that state.

This can happen because initialization is performed in two steps. First,
the tail block is allocated and the `tail.block` is set. If that is
successful `head.block` is set to the same pointer. Importantly,
initialization is skipped if `tail.block` is not null.

Therefore we can have the following situation:

1. Thread A starts to send the first value of the channel, observes that
   `tail.block` is null and begins initialization. It sets `tail.block`
   to point to a newly allocated block and then gets preempted.
   `head.block` is still null at this point.
2. Thread B starts to send the second value of the channel, observes
   that `tail.block` *is not* null and proceeds with writing its value
   in the allocated tail block and sets `tail.index` to 1.
3. Thread B drops the receiver of the channel which observes that
   `head.index != tail.index` (0 and 1 respectively), therefore there
   must be messages to drop. It starts traversing the linked list from
   `head.block` which is still a null pointer, leading to a segfault.

This PR fixes this problem by waiting for initialization to complete
when `head.index != tail.index` and the `head.block` is still null. A
similar check exists in `start_recv` for similar reasons.

Fixes #110001

Signed-off-by: Petros Angelatos <petrosagg@gmail.com>
2023-04-08 19:57:22 +02:00
Trevor Gross d1b28b75d2 Documentation updates to better share the purpose of OnceCell/OnceLock 2023-03-29 18:04:44 -04:00
Trevor Gross dc4ba57566 Stabilize a portion of 'once_cell'
Move items not part of this stabilization to 'lazy_cell' or 'once_cell_try'
2023-03-29 18:04:44 -04:00