diff --git a/Cargo.toml b/Cargo.toml index 41ad73a4..1b5404f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,9 +27,6 @@ mpmc_large = [] # This flag has no version guarantee, the `defmt` dependency can be updated in a patch release defmt-impl = ["defmt"] -[target.'cfg(not(target_os = "none"))'.dev-dependencies] -scoped_threadpool = "0.1.8" - [target.thumbv6m-none-eabi.dependencies] atomic-polyfill = { version = "0.1.2", optional = true } @@ -65,5 +62,8 @@ version = "0.1" version = ">=0.2.0,<0.4" optional = true +[build-dependencies] +rustc_version = "0.4.0" + [package.metadata.docs.rs] all-features = true diff --git a/build.rs b/build.rs index 0840d6fb..1342bd70 100644 --- a/build.rs +++ b/build.rs @@ -2,6 +2,8 @@ use std::{env, error::Error}; +use rustc_version::Channel; + fn main() -> Result<(), Box> { let target = env::var("TARGET")?; @@ -66,5 +68,12 @@ fn main() -> Result<(), Box> { _ => {} } + if !matches!( + rustc_version::version_meta().unwrap().channel, + Channel::Stable | Channel::Beta + ) { + println!("cargo:rustc-cfg=unstable_channel"); + } + Ok(()) } diff --git a/suppressions.txt b/suppressions.txt index bf051e53..1f4eb1ef 100644 --- a/suppressions.txt +++ b/suppressions.txt @@ -1,7 +1,7 @@ -# false positives in thread::spawn (?) -race:*dealloc -race:*drop_slow* -race:__call_tls_dtors +race:std::panic::catch_unwind +race:std::thread::scope -# false positives in scoped_threadpool (?) -race:*drop* +# std::thread::spawn false positive; seen on Ubuntu 20.04 but not on Arch Linux (2022-04-29) +race:drop_in_place*JoinHandle +race:alloc::sync::Arc<*>::drop_slow +race:__call_tls_dtors diff --git a/tests/tsan.rs b/tests/tsan.rs index 22a51958..9e87fb0e 100644 --- a/tests/tsan.rs +++ b/tests/tsan.rs @@ -1,11 +1,11 @@ +#![cfg_attr(unstable_channel, feature(scoped_threads))] #![deny(rust_2018_compatibility)] #![deny(rust_2018_idioms)] #![deny(warnings)] -use std::{sync::mpsc, thread}; +use std::thread; -use heapless::{mpmc::Q64, spsc}; -use scoped_threadpool::Pool; +use heapless::spsc; #[test] fn once() { @@ -51,6 +51,7 @@ fn twice() { } #[test] +#[cfg(unstable_channel)] fn scoped() { let mut rb: spsc::Queue = spsc::Queue::new(); @@ -59,12 +60,12 @@ fn scoped() { { let (mut p, mut c) = rb.split(); - Pool::new(2).scoped(move |scope| { - scope.execute(move || { + thread::scope(move |scope| { + scope.spawn(move || { p.enqueue(1).unwrap(); }); - scope.execute(move || { + scope.spawn(move || { c.dequeue().unwrap(); }); }); @@ -75,6 +76,7 @@ fn scoped() { #[test] #[cfg_attr(miri, ignore)] // too slow +#[cfg(unstable_channel)] fn contention() { const N: usize = 1024; @@ -83,8 +85,8 @@ fn contention() { { let (mut p, mut c) = rb.split(); - Pool::new(2).scoped(move |scope| { - scope.execute(move || { + thread::scope(move |scope| { + scope.spawn(move || { let mut sum: u32 = 0; for i in 0..(2 * N) { @@ -95,7 +97,7 @@ fn contention() { println!("producer: {}", sum); }); - scope.execute(move || { + scope.spawn(move || { let mut sum: u32 = 0; for _ in 0..(2 * N) { @@ -120,15 +122,20 @@ fn contention() { #[test] #[cfg_attr(miri, ignore)] // too slow +#[cfg(unstable_channel)] fn mpmc_contention() { + use std::sync::mpsc; + + use heapless::mpmc::Q64; + const N: u32 = 64; static Q: Q64 = Q64::new(); let (s, r) = mpsc::channel(); - Pool::new(2).scoped(|scope| { + thread::scope(|scope| { let s1 = s.clone(); - scope.execute(move || { + scope.spawn(move || { let mut sum: u32 = 0; for i in 0..(16 * N) { @@ -141,7 +148,7 @@ fn mpmc_contention() { }); let s2 = s.clone(); - scope.execute(move || { + scope.spawn(move || { let mut sum: u32 = 0; for _ in 0..(16 * N) { @@ -166,6 +173,7 @@ fn mpmc_contention() { #[test] #[cfg_attr(miri, ignore)] // too slow +#[cfg(unstable_channel)] fn unchecked() { const N: usize = 1024; @@ -178,14 +186,14 @@ fn unchecked() { { let (mut p, mut c) = rb.split(); - Pool::new(2).scoped(move |scope| { - scope.execute(move || { + thread::scope(move |scope| { + scope.spawn(move || { for _ in 0..N / 2 - 1 { p.enqueue(2).unwrap(); } }); - scope.execute(move || { + scope.spawn(move || { let mut sum: usize = 0; for _ in 0..N / 2 - 1 { @@ -246,8 +254,8 @@ fn pool() { A::grow(unsafe { &mut M }); - Pool::new(2).scoped(move |scope| { - scope.execute(move || { + thread::scope(move |scope| { + scope.spawn(move || { for _ in 0..N / 4 { let a = A::alloc().unwrap(); let b = A::alloc().unwrap(); @@ -257,7 +265,7 @@ fn pool() { } }); - scope.execute(move || { + scope.spawn(move || { for _ in 0..N / 2 { let a = A::alloc().unwrap(); let a = a.init([2; 8]);