use std::backtrace::Backtrace;
use crate::flash::ids::ThreadKey;
#[derive(Clone, Debug, derive_more::Display)]
#[display("{name} [{id} {key:?}]", name = self.name.as_deref().unwrap_or("<unnamed>"), id = self.id, key = self.key)]
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()),
}
}
}
pub(in crate::flash) fn parked_backtrace() -> Option<Backtrace> {
super::bt_enabled().then(Backtrace::force_capture)
}
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)")
}
}