1 #![allow(dead_code)] // stack_guard isn't used right now on all platforms
2
3 use crate::std::cell::RefCell;
4 use crate::std::sys::thread::guard::Guard;
5 use crate::std::thread::Thread;
6
7 struct ThreadInfo {
8 stack_guard: Option<Guard>,
9 thread: Thread,
10 }
11
12 thread_local! { static THREAD_INFO: RefCell<Option<ThreadInfo>> = const { RefCell::new(None) } }
13
14 impl ThreadInfo {
with<R, F>(f: F) -> Option<R> where F: FnOnce(&mut ThreadInfo) -> R,15 fn with<R, F>(f: F) -> Option<R>
16 where
17 F: FnOnce(&mut ThreadInfo) -> R,
18 {
19 THREAD_INFO
20 .try_with(move |thread_info| {
21 let mut thread_info = thread_info.borrow_mut();
22 let thread_info = thread_info.get_or_insert_with(|| ThreadInfo {
23 stack_guard: None,
24 thread: Thread::new(None),
25 });
26 f(thread_info)
27 })
28 .ok()
29 }
30 }
31
current_thread() -> Option<Thread>32 pub fn current_thread() -> Option<Thread> {
33 ThreadInfo::with(|info| info.thread.clone())
34 }
35
stack_guard() -> Option<Guard>36 pub fn stack_guard() -> Option<Guard> {
37 ThreadInfo::with(|info| info.stack_guard.clone()).and_then(|o| o)
38 }
39
set(stack_guard: Option<Guard>, thread: Thread)40 pub fn set(stack_guard: Option<Guard>, thread: Thread) {
41 THREAD_INFO.with(move |thread_info| {
42 let mut thread_info = thread_info.borrow_mut();
43 rtassert!(thread_info.is_none());
44 *thread_info = Some(ThreadInfo {
45 stack_guard,
46 thread,
47 });
48 });
49 }
50