Skip to content

Commit

Permalink
Auto merge of #120238 - joboet:always_confirm_lock_success, r=Mark-Si…
Browse files Browse the repository at this point in the history
…mulacrum

Always check the result of `pthread_mutex_lock`

Fixes #120147.

Instead of manually adding a list of "good" platforms, I've simply made the check unconditional. pthread's mutex is already quite slow on most platforms, so one single well-predictable branch shouldn't hurt performance too much.
  • Loading branch information
bors committed Feb 9, 2024
2 parents 98aa362 + 1df1ebf commit 972452c
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion library/std/src/sys/pal/unix/locks/pthread_mutex.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::cell::UnsafeCell;
use crate::io::Error;
use crate::mem::{forget, MaybeUninit};
use crate::sys::cvt_nz;
use crate::sys_common::lazy_box::{LazyBox, LazyInit};
Expand Down Expand Up @@ -103,8 +104,24 @@ impl Mutex {

#[inline]
pub unsafe fn lock(&self) {
#[cold]
#[inline(never)]
fn fail(r: i32) -> ! {
let error = Error::from_raw_os_error(r);
panic!("failed to lock mutex: {error}");
}

let r = libc::pthread_mutex_lock(raw(self));
debug_assert_eq!(r, 0);
// As we set the mutex type to `PTHREAD_MUTEX_NORMAL` above, we expect
// the lock call to never fail. Unfortunately however, some platforms
// (Solaris) do not conform to the standard, and instead always provide
// deadlock detection. How kind of them! Unfortunately that means that
// we need to check the error code here. To save us from UB on other
// less well-behaved platforms in the future, we do it even on "good"
// platforms like macOS. See #120147 for more context.
if r != 0 {
fail(r)
}
}

#[inline]
Expand Down

0 comments on commit 972452c

Please sign in to comment.