xref: /drstd/src/std/sys_common/thread_info.rs (revision 9670759b785600bf6315e4173e46a602f16add7a)
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