You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
|
|
|
|
use async_std::task;
|
|
|
|
use async_std::task_local;
|
|
|
|
|
|
|
|
#[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 = task::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);
|
|
|
|
});
|
|
|
|
}
|