use std::{backtrace::Backtrace, fmt};
use crate::flash::ids::ThreadKey;
#[derive(Clone, Debug)]
pub(in crate::flash) struct ThreadDesc {
pub(in crate::flash) key: ThreadKey,
name: Option<String>,
id: String,
}
impl ThreadDesc {
pub(in crate::flash) fn current() -> Self {
let t = std::thread::current();
Self {
key: ThreadKey::of(t.id()),
name: t.name().map(str::to_owned),
id: format!("{:?}", t.id()),
}
}
}
impl fmt::Display for ThreadDesc {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{name} [{id} {key:?}]",
name = self.name.as_deref().unwrap_or("<unnamed>"),
id = self.id,
key = self.key,
)
}
}
pub(in crate::flash) fn current_thread_context() -> String {
let desc = ThreadDesc::current();
if super::bt_enabled() {
format!(
"current thread: {desc}\nbacktrace:\n{bt}",
bt = Backtrace::force_capture(),
)
} else {
format!("current thread: {desc} (set KITHARA_FLASH_SYNC_BT=1 for a backtrace)")
}
}