use std::{
sync::atomic::{AtomicU64, Ordering},
thread::current,
};
static MAIN_THREAD_ID: AtomicU64 = AtomicU64::new(0);
pub fn current_thread_id() -> u64 {
current().id().as_u64().into()
}
pub fn assert_main_thread() {
assert!(
is_main_thread(),
"This operation can be called only from main thread"
);
}
pub fn is_main_thread() -> bool {
current_thread_id() == supposed_main_id()
}
pub fn set_current_thread_as_main() {
MAIN_THREAD_ID.store(current_thread_id(), Ordering::Relaxed);
}
pub(crate) fn supposed_main_id() -> u64 {
let id = MAIN_THREAD_ID.load(Ordering::Relaxed);
if id == 0 { 1 } else { id }
}
#[cfg(test)]
mod test {
use std::sync::atomic::Ordering;
use pretty_assertions::assert_eq;
use serial_test::serial;
use wasm_bindgen_test::wasm_bindgen_test;
use crate::{main_thread::MAIN_THREAD_ID, supposed_main_id};
#[serial]
#[wasm_bindgen_test(unsupported = test)]
fn test() {
MAIN_THREAD_ID.store(0, Ordering::Relaxed);
assert_eq!(supposed_main_id(), 1);
MAIN_THREAD_ID.store(5, Ordering::Relaxed);
assert_eq!(supposed_main_id(), 5);
}
}