mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Auto merge of #3170 - RalfJung:libc-tests, r=RalfJung
a bit of libc test reorganization
This commit is contained in:
commit
3d65927fae
@ -108,7 +108,7 @@ case $HOST_TARGET in
|
||||
MIRI_TEST_TARGET=aarch64-unknown-linux-gnu run_tests
|
||||
MIRI_TEST_TARGET=aarch64-apple-darwin run_tests
|
||||
MIRI_TEST_TARGET=i686-pc-windows-gnu run_tests
|
||||
MIRI_TEST_TARGET=x86_64-unknown-freebsd run_tests_minimal hello integer vec panic/panic concurrency/simple pthreads libc-getentropy libc-getrandom libc-reallocarray atomic env/var
|
||||
MIRI_TEST_TARGET=x86_64-unknown-freebsd run_tests_minimal hello integer vec panic/panic concurrency/simple pthread-threadname libc-getentropy libc-getrandom libc-misc atomic env align
|
||||
MIRI_TEST_TARGET=aarch64-linux-android run_tests_minimal hello integer vec panic/panic
|
||||
MIRI_TEST_TARGET=wasm32-wasi run_tests_minimal no_std integer strings wasm
|
||||
MIRI_TEST_TARGET=wasm32-unknown-unknown run_tests_minimal no_std integer strings wasm
|
||||
|
@ -172,6 +172,7 @@ fn test_thread_local_errno() {
|
||||
}
|
||||
|
||||
/// Tests whether clock support exists at all
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
fn test_clocks() {
|
||||
let mut tp = std::mem::MaybeUninit::<libc::timespec>::uninit();
|
||||
let is_error = unsafe { libc::clock_gettime(libc::CLOCK_REALTIME, tp.as_mut_ptr()) };
|
||||
@ -237,6 +238,7 @@ fn test_isatty() {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
fn test_posix_mkstemp() {
|
||||
use std::ffi::CString;
|
||||
use std::ffi::OsStr;
|
||||
@ -388,8 +390,23 @@ fn test_dlsym() {
|
||||
assert_eq!(errno, libc::EBADF);
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
fn test_reallocarray() {
|
||||
unsafe {
|
||||
let mut p = libc::reallocarray(std::ptr::null_mut(), 4096, 2);
|
||||
assert!(!p.is_null());
|
||||
libc::free(p);
|
||||
p = libc::malloc(16);
|
||||
let r = libc::reallocarray(p, 2, 32);
|
||||
assert!(!r.is_null());
|
||||
libc::free(r);
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
test_posix_gettimeofday();
|
||||
|
||||
#[cfg(not(target_os = "freebsd"))] // FIXME we should support this on FreeBSD as well
|
||||
test_posix_mkstemp();
|
||||
|
||||
test_posix_realpath_alloc();
|
||||
@ -399,12 +416,19 @@ fn main() {
|
||||
test_thread_local_errno();
|
||||
|
||||
test_isatty();
|
||||
|
||||
#[cfg(not(target_os = "freebsd"))] // FIXME we should support this on FreeBSD as well
|
||||
test_clocks();
|
||||
|
||||
test_dlsym();
|
||||
|
||||
test_memcpy();
|
||||
test_strcpy();
|
||||
|
||||
#[cfg(not(target_os = "macos"))] // reallocarray does not exist on macOS
|
||||
test_reallocarray();
|
||||
|
||||
// These are Linux-specific
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
test_posix_fadvise();
|
||||
|
@ -1,16 +0,0 @@
|
||||
//@ignore-target-windows: no libc
|
||||
//@ignore-target-apple: no support (yet)
|
||||
|
||||
use core::ptr;
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
let mut p = libc::reallocarray(ptr::null_mut(), 4096, 2);
|
||||
assert!(!p.is_null());
|
||||
libc::free(p);
|
||||
p = libc::malloc(16);
|
||||
let r = libc::reallocarray(p, 2, 32);
|
||||
assert!(!r.is_null());
|
||||
libc::free(r);
|
||||
}
|
||||
}
|
@ -1,26 +1,15 @@
|
||||
//@ignore-target-windows: No libc on Windows
|
||||
use std::ffi::CStr;
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
use std::ffi::CString;
|
||||
use std::thread;
|
||||
|
||||
fn main() {
|
||||
test_named_thread_truncation();
|
||||
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
test_mutex_libc_init_recursive();
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
test_mutex_libc_init_normal();
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
test_mutex_libc_init_errorcheck();
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
test_rwlock_libc_static_initializer();
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
test_mutex_libc_static_initializer_recursive();
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
fn test_mutex_libc_init_recursive() {
|
||||
unsafe {
|
||||
let mut attr: libc::pthread_mutexattr_t = std::mem::zeroed();
|
||||
@ -45,7 +34,6 @@ fn test_mutex_libc_init_recursive() {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
fn test_mutex_libc_init_normal() {
|
||||
unsafe {
|
||||
let mut mutexattr: libc::pthread_mutexattr_t = std::mem::zeroed();
|
||||
@ -68,7 +56,6 @@ fn test_mutex_libc_init_normal() {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
fn test_mutex_libc_init_errorcheck() {
|
||||
unsafe {
|
||||
let mut mutexattr: libc::pthread_mutexattr_t = std::mem::zeroed();
|
||||
@ -114,7 +101,6 @@ fn test_mutex_libc_static_initializer_recursive() {
|
||||
// Testing the behavior of std::sync::RwLock does not fully exercise the pthread rwlock shims, we
|
||||
// need to go a layer deeper and test the behavior of the libc functions, because
|
||||
// std::sys::unix::rwlock::RWLock itself keeps track of write_locked and num_readers.
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
fn test_rwlock_libc_static_initializer() {
|
||||
let rw = std::cell::UnsafeCell::new(libc::PTHREAD_RWLOCK_INITIALIZER);
|
||||
unsafe {
|
||||
@ -139,49 +125,3 @@ fn test_rwlock_libc_static_initializer() {
|
||||
assert_eq!(libc::pthread_rwlock_destroy(rw.get()), 0);
|
||||
}
|
||||
}
|
||||
|
||||
fn test_named_thread_truncation() {
|
||||
let long_name = std::iter::once("test_named_thread_truncation")
|
||||
.chain(std::iter::repeat(" yada").take(100))
|
||||
.collect::<String>();
|
||||
|
||||
fn set_thread_name(name: &CStr) -> i32 {
|
||||
#[cfg(target_os = "linux")]
|
||||
return unsafe { libc::pthread_setname_np(libc::pthread_self(), name.as_ptr().cast()) };
|
||||
#[cfg(target_os = "freebsd")]
|
||||
unsafe {
|
||||
// pthread_set_name_np does not return anything
|
||||
libc::pthread_set_name_np(libc::pthread_self(), name.as_ptr().cast());
|
||||
return 0;
|
||||
};
|
||||
#[cfg(target_os = "macos")]
|
||||
return unsafe { libc::pthread_setname_np(name.as_ptr().cast()) };
|
||||
}
|
||||
|
||||
let result = thread::Builder::new().name(long_name.clone()).spawn(move || {
|
||||
// Rust remembers the full thread name itself.
|
||||
assert_eq!(thread::current().name(), Some(long_name.as_str()));
|
||||
|
||||
// But the system is limited -- make sure we successfully set a truncation.
|
||||
let mut buf = vec![0u8; long_name.len() + 1];
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
unsafe {
|
||||
libc::pthread_getname_np(libc::pthread_self(), buf.as_mut_ptr().cast(), buf.len())
|
||||
};
|
||||
#[cfg(target_os = "freebsd")]
|
||||
unsafe {
|
||||
libc::pthread_get_name_np(libc::pthread_self(), buf.as_mut_ptr().cast(), buf.len())
|
||||
};
|
||||
let cstr = CStr::from_bytes_until_nul(&buf).unwrap();
|
||||
assert!(cstr.to_bytes().len() >= 15, "name is too short: len={}", cstr.to_bytes().len()); // POSIX seems to promise at least 15 chars
|
||||
assert!(long_name.as_bytes().starts_with(cstr.to_bytes()));
|
||||
|
||||
// Also test directly calling pthread_setname to check its return value.
|
||||
assert_eq!(set_thread_name(&cstr), 0);
|
||||
// But with a too long name it should fail (except on FreeBSD where the
|
||||
// function has no return, hence cannot indicate failure).
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
assert_ne!(set_thread_name(&CString::new(long_name).unwrap()), 0);
|
||||
});
|
||||
result.unwrap().join().unwrap();
|
||||
}
|
51
src/tools/miri/tests/pass-dep/shims/pthread-threadname.rs
Normal file
51
src/tools/miri/tests/pass-dep/shims/pthread-threadname.rs
Normal file
@ -0,0 +1,51 @@
|
||||
//@ignore-target-windows: No libc on Windows
|
||||
use std::ffi::CStr;
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
use std::ffi::CString;
|
||||
use std::thread;
|
||||
|
||||
fn main() {
|
||||
let long_name = std::iter::once("test_named_thread_truncation")
|
||||
.chain(std::iter::repeat(" yada").take(100))
|
||||
.collect::<String>();
|
||||
|
||||
fn set_thread_name(name: &CStr) -> i32 {
|
||||
#[cfg(target_os = "linux")]
|
||||
return unsafe { libc::pthread_setname_np(libc::pthread_self(), name.as_ptr().cast()) };
|
||||
#[cfg(target_os = "freebsd")]
|
||||
unsafe {
|
||||
// pthread_set_name_np does not return anything
|
||||
libc::pthread_set_name_np(libc::pthread_self(), name.as_ptr().cast());
|
||||
return 0;
|
||||
};
|
||||
#[cfg(target_os = "macos")]
|
||||
return unsafe { libc::pthread_setname_np(name.as_ptr().cast()) };
|
||||
}
|
||||
|
||||
let result = thread::Builder::new().name(long_name.clone()).spawn(move || {
|
||||
// Rust remembers the full thread name itself.
|
||||
assert_eq!(thread::current().name(), Some(long_name.as_str()));
|
||||
|
||||
// But the system is limited -- make sure we successfully set a truncation.
|
||||
let mut buf = vec![0u8; long_name.len() + 1];
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
unsafe {
|
||||
libc::pthread_getname_np(libc::pthread_self(), buf.as_mut_ptr().cast(), buf.len())
|
||||
};
|
||||
#[cfg(target_os = "freebsd")]
|
||||
unsafe {
|
||||
libc::pthread_get_name_np(libc::pthread_self(), buf.as_mut_ptr().cast(), buf.len())
|
||||
};
|
||||
let cstr = CStr::from_bytes_until_nul(&buf).unwrap();
|
||||
assert!(cstr.to_bytes().len() >= 15, "name is too short: len={}", cstr.to_bytes().len()); // POSIX seems to promise at least 15 chars
|
||||
assert!(long_name.as_bytes().starts_with(cstr.to_bytes()));
|
||||
|
||||
// Also test directly calling pthread_setname to check its return value.
|
||||
assert_eq!(set_thread_name(&cstr), 0);
|
||||
// But with a too long name it should fail (except on FreeBSD where the
|
||||
// function has no return, hence cannot indicate failure).
|
||||
#[cfg(not(target_os = "freebsd"))]
|
||||
assert_ne!(set_thread_name(&CString::new(long_name).unwrap()), 0);
|
||||
});
|
||||
result.unwrap().join().unwrap();
|
||||
}
|
Loading…
Reference in New Issue
Block a user