diff --git a/libc-test/build.rs b/libc-test/build.rs index 0e56050b008de..5376c46860d6d 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -231,6 +231,7 @@ fn test_apple(target: &str) { "netinet/ip.h", "netinet/tcp.h", "netinet/udp.h", + "os/lock.h", "poll.h", "pthread.h", "pthread_spis.h", @@ -2442,6 +2443,8 @@ fn test_emscripten(target: &str) { // Just pass all these through, no need for a "struct" prefix "FILE" | "fd_set" | "Dl_info" | "DIR" => ty.to_string(), + "os_unfair_lock" => "struct os_unfair_lock_s".to_string(), + t if is_union => format!("union {}", t), t if t.ends_with("_t") => t.to_string(), diff --git a/libc-test/semver/apple.txt b/libc-test/semver/apple.txt index cb646e686bfe8..83cd77d9a23db 100644 --- a/libc-test/semver/apple.txt +++ b/libc-test/semver/apple.txt @@ -1003,6 +1003,7 @@ OFDEL OFILL OLD_TIME ONOEOT +OS_UNFAIR_LOCK_INIT OXTABS O_ASYNC O_DSYNC @@ -1993,6 +1994,14 @@ open_memstream open_wmemstream openat openpty +os_unfair_lock +os_unfair_lock_s +os_unfair_lock_t +os_unfair_lock_lock +os_unfair_lock_trylock +os_unfair_lock_unlock +os_unfair_lock_assert_owner +os_unfair_lock_assert_not_owner pause policy_t popen diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs index cee87ffbfc490..a9438ef57a3c2 100644 --- a/src/unix/bsd/apple/mod.rs +++ b/src/unix/bsd/apple/mod.rs @@ -121,6 +121,9 @@ pub type pthread_introspection_hook_t = extern "C" fn(event: ::c_uint, thread: ::pthread_t, addr: *mut ::c_void, size: ::size_t); pub type pthread_jit_write_callback_t = ::Option ::c_int>; +pub type os_unfair_lock = os_unfair_lock_s; +pub type os_unfair_lock_t = *mut os_unfair_lock; + pub type vm_statistics_t = *mut vm_statistics; pub type vm_statistics_data_t = vm_statistics; pub type vm_statistics64_t = *mut vm_statistics64; @@ -1295,6 +1298,10 @@ s_no_extra_traits! { pub l2p_contigbytes: ::off_t, pub l2p_devoffset: ::off_t, } + + pub struct os_unfair_lock_s { + _os_unfair_lock_opaque: u32, + } } impl siginfo_t { @@ -2576,6 +2583,27 @@ cfg_if! { l2p_devoffset.hash(state); } } + impl PartialEq for os_unfair_lock { + fn eq(&self, other: &os_unfair_lock) -> bool { + self._os_unfair_lock_opaque == other._os_unfair_lock_opaque + } + } + + impl Eq for os_unfair_lock {} + + impl ::fmt::Debug for os_unfair_lock { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("os_unfair_lock") + .field("_os_unfair_lock_opaque", &self._os_unfair_lock_opaque) + .finish() + } + } + + impl ::hash::Hash for os_unfair_lock { + fn hash(&self, state: &mut H) { + self._os_unfair_lock_opaque.hash(state); + } + } } } @@ -3863,6 +3891,10 @@ pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { __opaque: [0; __PTHREAD_RWLOCK_SIZE__], }; +pub const OS_UNFAIR_LOCK_INIT: os_unfair_lock = os_unfair_lock { + _os_unfair_lock_opaque: 0, +}; + pub const MINSIGSTKSZ: ::size_t = 32768; pub const SIGSTKSZ: ::size_t = 131072; @@ -5221,6 +5253,12 @@ extern "C" { pub fn pthread_jit_write_freeze_callbacks_np(); pub fn pthread_cpu_number_np(cpu_number_out: *mut ::size_t) -> ::c_int; + pub fn os_unfair_lock_lock(lock: os_unfair_lock_t); + pub fn os_unfair_lock_trylock(lock: os_unfair_lock_t) -> bool; + pub fn os_unfair_lock_unlock(lock: os_unfair_lock_t); + pub fn os_unfair_lock_assert_owner(lock: os_unfair_lock_t); + pub fn os_unfair_lock_assert_not_owner(lock: os_unfair_lock_t); + pub fn thread_policy_set( thread: thread_t, flavor: thread_policy_flavor_t,