| use std::sync::atomic::{AtomicBool, Ordering}; |
| |
| use async_std::task; |
| use async_std::task_local; |
| |
| #[cfg(not(target_os = "unknown"))] |
| use async_std::task::spawn; |
| #[cfg(target_os = "unknown")] |
| use async_std::task::spawn_local as spawn; |
| |
| #[cfg(target_arch = "wasm32")] |
| wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); |
| |
| #[test] |
| #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] |
| fn drop_local() { |
| static DROP_LOCAL: AtomicBool = AtomicBool::new(false); |
| |
| struct Local; |
| |
| impl Drop for Local { |
| fn drop(&mut self) { |
| DROP_LOCAL.store(true, Ordering::SeqCst); |
| } |
| } |
| |
| task_local! { |
| static LOCAL: Local = Local; |
| } |
| |
| // Spawn a task that just touches its task-local. |
| let handle = spawn(async { |
| LOCAL.with(|_| ()); |
| }); |
| let task = handle.task().clone(); |
| |
| // Wait for the task to finish and make sure its task-local has been dropped. |
| task::block_on(async { |
| handle.await; |
| assert!(DROP_LOCAL.load(Ordering::SeqCst)); |
| drop(task); |
| }); |
| } |