diff --git a/libc-test/semver/apple.txt b/libc-test/semver/apple.txt index d56b44a13b86d..d54c4155a44af 100644 --- a/libc-test/semver/apple.txt +++ b/libc-test/semver/apple.txt @@ -1193,6 +1193,7 @@ THOUSEP THREAD_BACKGROUND_POLICY THREAD_BACKGROUND_POLICY_DARWIN_BG THREAD_BACKGROUND_POLICY_COUNT +THREAD_BASIC_INFO THREAD_AFFINITY_POLICY THREAD_AFFINITY_POLICY_COUNT THREAD_AFFINITY_TAG_NULL @@ -1208,6 +1209,14 @@ THREAD_THROUGHPUT_QOS_POLICY THREAD_THROUGHPUT_QOS_POLICY_COUNT THREAD_TIME_CONSTRAINT_POLICY THREAD_TIME_CONSTRAINT_POLICY_COUNT +TH_FLAGS_GLOBAL_FORCED_IDLE +TH_FLAGS_IDLE +TH_FLAGS_SWAPPED +TH_STATE_HALTED +TH_STATE_RUNNING +TH_STATE_STOPPED +TH_STATE_UNINTERRUPTIBLE +TH_STATE_WAITING TIME_DEL TIME_ERROR TIME_INS @@ -1731,6 +1740,7 @@ open_wmemstream openat openpty pause +policy_t popen posix_madvise posix_spawn @@ -1873,10 +1883,16 @@ sysctl sysctlbyname sysctlnametomib telldir +thread_basic_info_t +thread_flavor_t +thread_info +thread_info_t +thread_inspect_t thread_policy_set thread_policy_get timeval32 timex +time_value_t truncate ttyname_r ucontext_t diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs index a489050e4d966..5794c63d4325c 100644 --- a/src/unix/bsd/apple/mod.rs +++ b/src/unix/bsd/apple/mod.rs @@ -41,6 +41,9 @@ pub type sae_connid_t = u32; pub type mach_port_t = ::c_uint; pub type processor_flavor_t = ::c_int; +pub type thread_flavor_t = natural_t; +pub type thread_inspect_t = mach_port_t; +pub type policy_t = ::c_int; pub type iconv_t = *mut ::c_void; @@ -55,6 +58,9 @@ pub type processor_set_load_info_t = *mut processor_set_load_info; pub type processor_info_t = *mut integer_t; pub type processor_info_array_t = *mut integer_t; +pub type thread_info_t = *mut integer_t; +pub type thread_basic_info_t = *mut thread_basic_info; + pub type thread_t = mach_port_t; pub type thread_policy_flavor_t = natural_t; pub type thread_policy_t = *mut integer_t; @@ -806,6 +812,22 @@ s_no_extra_traits! { pub load_average: integer_t, pub mach_factor: integer_t, } + + pub struct time_value_t { + pub seconds: integer_t, + pub microseconds: integer_t, + } + + pub struct thread_basic_info { + pub user_time: time_value_t, + pub system_time: time_value_t, + pub cpu_usage: ::integer_t, + pub policy: ::policy_t, + pub run_state: ::integer_t, + pub flags: ::integer_t, + pub suspend_count: ::integer_t, + pub sleep_time: ::integer_t, + } } impl siginfo_t { @@ -1520,6 +1542,67 @@ cfg_if! { self.mach_factor.hash(state); } } + + impl PartialEq for time_value_t { + fn eq(&self, other: &time_value_t) -> bool { + self.seconds == other.seconds + && self.microseconds == other.microseconds + } + } + impl Eq for time_value_t {} + impl ::fmt::Debug for time_value_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("time_value_t") + .field("seconds", &self.seconds) + .field("microseconds", &self.seconds) + .finish() + } + } + impl ::hash::Hash for time_value_t { + fn hash(&self, state: &mut H) { + self.seconds.hash(state); + self.microseconds.hash(state); + } + } + impl PartialEq for thread_basic_info { + fn eq(&self, other: &thread_basic_info) -> bool { + self.user_time == other.user_time + && self.system_time == other.system_time + && self.cpu_usage == other.cpu_usage + && self.policy == other.policy + && self.run_state == other.run_state + && self.flags == other.flags + && self.suspend_count == other.suspend_count + && self.sleep_time == other.sleep_time + } + } + impl Eq for thread_basic_info {} + impl ::fmt::Debug for thread_basic_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("thread_basic_info") + .field("user_time", &self.user_time) + .field("system_time", &self.system_time) + .field("cpu_usage", &self.cpu_usage) + .field("policy", &self.policy) + .field("run_state", &self.run_state) + .field("flags", &self.flags) + .field("suspend_count", &self.suspend_count) + .field("sleep_time", &self.sleep_time) + .finish() + } + } + impl ::hash::Hash for thread_basic_info { + fn hash(&self, state: &mut H) { + self.user_time.hash(state); + self.system_time.hash(state); + self.cpu_usage.hash(state); + self.policy.hash(state); + self.run_state.hash(state); + self.flags.hash(state); + self.suspend_count.hash(state); + self.sleep_time.hash(state); + } + } } } @@ -3525,6 +3608,17 @@ pub const THREAD_BACKGROUND_POLICY_DARWIN_BG: ::c_int = 0x1000; pub const THREAD_LATENCY_QOS_POLICY: ::c_int = 7; pub const THREAD_THROUGHPUT_QOS_POLICY: ::c_int = 8; +// +pub const TH_STATE_RUNNING: ::c_int = 1; +pub const TH_STATE_STOPPED: ::c_int = 2; +pub const TH_STATE_WAITING: ::c_int = 3; +pub const TH_STATE_UNINTERRUPTIBLE: ::c_int = 4; +pub const TH_STATE_HALTED: ::c_int = 5; +pub const TH_FLAGS_SWAPPED: ::c_int = 0x1; +pub const TH_FLAGS_IDLE: ::c_int = 0x2; +pub const TH_FLAGS_GLOBAL_FORCED_IDLE: ::c_int = 0x4; +pub const THREAD_BASIC_INFO: ::c_int = 3; + // CommonCrypto/CommonCryptoError.h pub const kCCSuccess: i32 = 0; pub const kCCParamError: i32 = -4300; @@ -3830,6 +3924,12 @@ extern "C" { count: *mut mach_msg_type_number_t, get_default: *mut boolean_t, ) -> kern_return_t; + pub fn thread_info( + target_act: thread_inspect_t, + flavor: thread_flavor_t, + thread_info_out: thread_info_t, + thread_info_outCnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; pub fn __error() -> *mut ::c_int; pub fn backtrace(buf: *mut *mut ::c_void, sz: ::c_int) -> ::c_int; #[cfg_attr(