mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-28 11:38:01 +00:00 
			
		
		
		
	 75fa9f6dec
			
		
	
	
		75fa9f6dec
		
	
	
	
	
		
			
			This commit is extracted from #122036 and adds a new directive to the `compiletest` test runner, `//@ needs-threads`. This is intended to capture the need that a target must implement threading to execute a specific test, typically one that uses `std::thread`. This is primarily done for WebAssembly targets which currently do not have threads by default. This enables transitioning a lot of `//@ ignore-wasm*`-style ignores into a more self-documenting `//@ needs-threads` directive. Additionally the `wasm32-wasi-preview1-threads` target, for example, does actually have threads, but isn't tested in CI at this time. This change enables running these tests for that target, but not other wasm targets.
		
			
				
	
	
		
			45 lines
		
	
	
		
			868 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			868 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ run-pass
 | |
| #![allow(stable_features)]
 | |
| 
 | |
| //@ needs-threads
 | |
| 
 | |
| #![feature(thread_local_try_with)]
 | |
| 
 | |
| use std::thread;
 | |
| use std::sync::atomic::{AtomicUsize, Ordering};
 | |
| 
 | |
| struct Foo { cnt: usize }
 | |
| 
 | |
| thread_local!(static FOO: Foo = Foo::init());
 | |
| 
 | |
| static CNT: AtomicUsize = AtomicUsize::new(0);
 | |
| 
 | |
| impl Foo {
 | |
|     fn init() -> Foo {
 | |
|         let cnt = CNT.fetch_add(1, Ordering::SeqCst);
 | |
|         if cnt == 0 {
 | |
|             FOO.with(|_| {});
 | |
|         }
 | |
|         Foo { cnt: cnt }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl Drop for Foo {
 | |
|     fn drop(&mut self) {
 | |
|         if self.cnt == 1 {
 | |
|             FOO.with(|foo| assert_eq!(foo.cnt, 0));
 | |
|         } else {
 | |
|             assert_eq!(self.cnt, 0);
 | |
|             if FOO.try_with(|_| ()).is_ok() {
 | |
|                 panic!("should not be in valid state");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     thread::spawn(|| {
 | |
|         FOO.with(|_| {});
 | |
|     }).join().unwrap();
 | |
| }
 |