From 8372b50a6faa2883a6bd15fde121fcb47e6d43e9 Mon Sep 17 00:00:00 2001 From: dybucc <149513579+dybucc@users.noreply.github.com> Date: Thu, 18 Jun 2026 15:53:52 +0200 Subject: [PATCH 1/2] feat: add macro to declare unstable constants This patch adds a new macro that can be used for declaring constants when these are known to possibly change upstream across target OS/ABI versions. --- src/macros.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/macros.rs b/src/macros.rs index 0149b1fd18466..5c5b8c2deac79 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -402,6 +402,21 @@ macro_rules! offset_of { }}; } +/// Defines constants with an accompanying doc comment pointing out their +/// instability, and links to the crate documentation for usage guidelines. +macro_rules! ct { + ($($it:item)+) => { +$( +/// This constant, among others often used in C for the purposes of denoting the +/// latest value or limit in a set of constants, is likely to change upstream. +/// For correct usage, see the [crate-level documentation][docs]. +/// +/// [docs]: index.html#usage-recommendations +$it +)+ + }; +} + #[cfg(test)] mod tests { use core::any::TypeId; From 209065b3d8e19ccf387ebe629ebbf3f2b9d99f4d Mon Sep 17 00:00:00 2001 From: dybucc <149513579+dybucc@users.noreply.github.com> Date: Thu, 28 May 2026 19:13:57 +0200 Subject: [PATCH 2/2] refactor: deprecate *COUNT consts fitting rust-lang/libc#3131 These constants were already part of prior deprecation efforts in rust-lang/libc#3620, though this was not completed. Alongside the work and comments there, a few other constants have been researched and marked for deprecation. The accompnying PR contains sources to upstream kernels/libraries with reasoning as to why some constants were deprecated and others weren't. --- src/unix/bsd/apple/mod.rs | 83 +++++++++++++++++------------- src/unix/linux_like/android/mod.rs | 5 +- src/unix/linux_like/linux/mod.rs | 5 +- src/unix/solarish/illumos.rs | 5 +- 4 files changed, 60 insertions(+), 38 deletions(-) diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs index f0bd543bf6df8..51092ba309864 100644 --- a/src/unix/bsd/apple/mod.rs +++ b/src/unix/bsd/apple/mod.rs @@ -3733,7 +3733,11 @@ pub const MNT_NOWAIT: c_int = 2; // pub const THREAD_STANDARD_POLICY: c_int = 1; -pub const THREAD_STANDARD_POLICY_COUNT: c_int = 0; + +ct! { + pub const THREAD_STANDARD_POLICY_COUNT: c_int = 0; +} + pub const THREAD_EXTENDED_POLICY: c_int = 1; pub const THREAD_TIME_CONSTRAINT_POLICY: c_int = 2; pub const THREAD_PRECEDENCE_POLICY: c_int = 3; @@ -3795,7 +3799,11 @@ pub const VM_PAGE_QUERY_PAGE_CS_NX: i32 = 0x400; // mach/task_info.h pub const TASK_THREAD_TIMES_INFO: u32 = 3; -pub const HOST_CPU_LOAD_INFO_COUNT: u32 = 4; + +ct! { + pub const HOST_CPU_LOAD_INFO_COUNT: u32 = 4; +} + pub const MACH_TASK_BASIC_INFO: u32 = 20; pub const MACH_PORT_NULL: i32 = 0; @@ -3858,7 +3866,10 @@ pub const COPYFILE_STATE_DST_BSIZE: c_int = 12; pub const COPYFILE_STATE_BSIZE: c_int = 13; // -pub const ATTR_BIT_MAP_COUNT: c_ushort = 5; +ct! { + pub const ATTR_BIT_MAP_COUNT: c_ushort = 5; +} + pub const FSOPT_NOFOLLOW: u32 = 0x1; pub const FSOPT_NOFOLLOW_ANY: u32 = 0x800; pub const FSOPT_REPORT_FULLSIZE: u32 = 0x4; @@ -4029,38 +4040,40 @@ const fn __DARWIN_ALIGN32(p: usize) -> usize { (p + __DARWIN_ALIGNBYTES32) & !__DARWIN_ALIGNBYTES32 } -pub const THREAD_EXTENDED_POLICY_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) as mach_msg_type_number_t; -pub const THREAD_TIME_CONSTRAINT_POLICY_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) - as mach_msg_type_number_t; -pub const THREAD_PRECEDENCE_POLICY_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) - as mach_msg_type_number_t; -pub const THREAD_AFFINITY_POLICY_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) as mach_msg_type_number_t; -pub const THREAD_BACKGROUND_POLICY_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) - as mach_msg_type_number_t; -pub const THREAD_LATENCY_QOS_POLICY_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) - as mach_msg_type_number_t; -pub const THREAD_THROUGHPUT_QOS_POLICY_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) - as mach_msg_type_number_t; -pub const THREAD_BASIC_INFO_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) as mach_msg_type_number_t; -pub const THREAD_IDENTIFIER_INFO_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) as mach_msg_type_number_t; -pub const THREAD_EXTENDED_INFO_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) as mach_msg_type_number_t; - -pub const TASK_THREAD_TIMES_INFO_COUNT: u32 = - (size_of::() / size_of::()) as u32; -pub const MACH_TASK_BASIC_INFO_COUNT: u32 = - (size_of::() / size_of::()) as u32; -pub const HOST_VM_INFO64_COUNT: mach_msg_type_number_t = - (size_of::() / size_of::()) as mach_msg_type_number_t; +ct! { + pub const THREAD_EXTENDED_POLICY_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) as mach_msg_type_number_t; + pub const THREAD_TIME_CONSTRAINT_POLICY_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) + as mach_msg_type_number_t; + pub const THREAD_PRECEDENCE_POLICY_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) + as mach_msg_type_number_t; + pub const THREAD_AFFINITY_POLICY_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) as mach_msg_type_number_t; + pub const THREAD_BACKGROUND_POLICY_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) + as mach_msg_type_number_t; + pub const THREAD_LATENCY_QOS_POLICY_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) + as mach_msg_type_number_t; + pub const THREAD_THROUGHPUT_QOS_POLICY_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) + as mach_msg_type_number_t; + pub const THREAD_BASIC_INFO_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) as mach_msg_type_number_t; + pub const THREAD_IDENTIFIER_INFO_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) as mach_msg_type_number_t; + pub const THREAD_EXTENDED_INFO_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) as mach_msg_type_number_t; + + pub const TASK_THREAD_TIMES_INFO_COUNT: u32 = + (size_of::() / size_of::()) as u32; + pub const MACH_TASK_BASIC_INFO_COUNT: u32 = + (size_of::() / size_of::()) as u32; + pub const HOST_VM_INFO64_COUNT: mach_msg_type_number_t = + (size_of::() / size_of::()) as mach_msg_type_number_t; +} // bsd/net/if_mib.h /// Non-interface-specific diff --git a/src/unix/linux_like/android/mod.rs b/src/unix/linux_like/android/mod.rs index b262ff8a142c7..0978c7fe6f151 100644 --- a/src/unix/linux_like/android/mod.rs +++ b/src/unix/linux_like/android/mod.rs @@ -1569,7 +1569,10 @@ pub const NFNL_SUBSYS_CTNETLINK_TIMEOUT: c_int = 8; pub const NFNL_SUBSYS_CTHELPER: c_int = 9; pub const NFNL_SUBSYS_NFTABLES: c_int = 10; pub const NFNL_SUBSYS_NFT_COMPAT: c_int = 11; -pub const NFNL_SUBSYS_COUNT: c_int = 12; + +ct! { + pub const NFNL_SUBSYS_COUNT: c_int = 12; +} pub const NFNL_MSG_BATCH_BEGIN: c_int = NLMSG_MIN_TYPE; pub const NFNL_MSG_BATCH_END: c_int = NLMSG_MIN_TYPE + 1; diff --git a/src/unix/linux_like/linux/mod.rs b/src/unix/linux_like/linux/mod.rs index 081b16d78ce39..a448ee8968264 100644 --- a/src/unix/linux_like/linux/mod.rs +++ b/src/unix/linux_like/linux/mod.rs @@ -1899,7 +1899,10 @@ pub const NFNL_SUBSYS_CTHELPER: c_int = 9; pub const NFNL_SUBSYS_NFTABLES: c_int = 10; pub const NFNL_SUBSYS_NFT_COMPAT: c_int = 11; pub const NFNL_SUBSYS_HOOK: c_int = 12; -pub const NFNL_SUBSYS_COUNT: c_int = 13; + +ct! { + pub const NFNL_SUBSYS_COUNT: c_int = 13; +} pub const NFNL_MSG_BATCH_BEGIN: c_int = crate::NLMSG_MIN_TYPE; pub const NFNL_MSG_BATCH_END: c_int = crate::NLMSG_MIN_TYPE + 1; diff --git a/src/unix/solarish/illumos.rs b/src/unix/solarish/illumos.rs index b31c31bd1f6c8..54826eb949346 100644 --- a/src/unix/solarish/illumos.rs +++ b/src/unix/solarish/illumos.rs @@ -186,7 +186,10 @@ pub const PRIV_USER: c_uint = PRIV_DEBUG | PRIV_AWARE_RESET | PRIV_PFEXEC; -pub const LGRP_RSRC_COUNT: crate::lgrp_rsrc_t = 2; +ct! { + pub const LGRP_RSRC_COUNT: crate::lgrp_rsrc_t = 2; +} + pub const LGRP_RSRC_CPU: crate::lgrp_rsrc_t = 0; pub const LGRP_RSRC_MEM: crate::lgrp_rsrc_t = 1;