diff --git a/libc-test/build.rs b/libc-test/build.rs index 8c669119b74b2..a0e0380e61a96 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -1897,6 +1897,7 @@ fn test_freebsd(target: &str) { "machine/elf.h", "machine/reg.h", "malloc_np.h", + "memstat.h", "mqueue.h", "net/bpf.h", "net/if.h", @@ -2256,6 +2257,10 @@ fn test_freebsd(target: &str) { // `shm_largepage_conf` was introduced in FreeBSD 13. "shm_largepage_conf" if Some(13) > freebsd_ver => true, + // Those are private types + "memory_type" => true, + "memory_type_list" => true, + _ => false, } }); diff --git a/libc-test/semver/freebsd.txt b/libc-test/semver/freebsd.txt index 5f08177f2442e..8f73e027afce0 100644 --- a/libc-test/semver/freebsd.txt +++ b/libc-test/semver/freebsd.txt @@ -1670,6 +1670,14 @@ mallocx memmem memrchr memset_s +memstat_get_name +memstat_mtl_alloc +memstat_mtl_find +memstat_mtl_first +memstat_mtl_free +memstat_mtl_geterror +memstat_mtl_next +memstat_strerror mincore mkdirat mkfifoat diff --git a/src/unix/bsd/freebsdlike/freebsd/mod.rs b/src/unix/bsd/freebsdlike/freebsd/mod.rs index 1e791ab0c0deb..02b0bbb4e3c6f 100644 --- a/src/unix/bsd/freebsdlike/freebsd/mod.rs +++ b/src/unix/bsd/freebsdlike/freebsd/mod.rs @@ -998,6 +998,14 @@ s! { pub alloc_policy: ::c_int, __pad: [::c_int; 10], } + + pub struct memory_type { + __priv: [::uintptr_t; 58], + } + + pub struct memory_type_list { + __priv: [::uintptr_t; 2], + } } s_no_extra_traits! { @@ -4369,6 +4377,22 @@ extern "C" { ) -> ::c_int; } +#[link(name = "memstat")] +extern "C" { + pub fn memstat_strerror(error: ::c_int) -> *const ::c_char; + pub fn memstat_mtl_alloc() -> *mut memory_type_list; + pub fn memstat_mtl_first(list: *mut memory_type_list) -> *mut memory_type; + pub fn memstat_mtl_next(mtp: *mut memory_type) -> *mut memory_type; + pub fn memstat_mtl_find( + list: *mut memory_type_list, + allocator: ::c_int, + name: *const ::c_char, + ) -> *mut memory_type; + pub fn memstat_mtl_free(list: *mut memory_type_list); + pub fn memstat_mtl_geterror(list: *mut memory_type_list) -> ::c_int; + pub fn memstat_get_name(mtp: *const memory_type) -> *const ::c_char; +} + #[link(name = "kvm")] extern "C" { pub fn kvm_dpcpu_setcpu(kd: *mut ::kvm_t, cpu: ::c_uint) -> ::c_int;