#![allow(unsafe_code)]
#[macro_export]
macro_rules! crash_here {
($point:expr) => {
$crate::crash::maybe_crash($point)
};
}
pub mod points {
pub const S_AFTER_O_HELLO: &str = "s-after-o-hello";
pub const S_AFTER_SPAWN_SUCCESSOR: &str = "s-after-spawn-successor";
pub const S_AFTER_N_HELLO: &str = "s-after-n-hello";
pub const S_AFTER_PREPARE_SENT: &str = "s-after-prepare-sent";
pub const S_AFTER_DRAINED_RECV: &str = "s-after-drained-recv";
pub const S_AFTER_SEAL_REQUEST_SENT: &str = "s-after-seal-request-sent";
pub const S_AFTER_SEAL_COMPLETE_RECV: &str = "s-after-seal-complete-recv";
pub const S_AFTER_BEGIN_SENT: &str = "s-after-begin-sent";
pub const S_AFTER_READY_RECV: &str = "s-after-ready-recv";
pub const S_AFTER_COMMIT_SENT: &str = "s-after-commit-sent";
pub const S_AFTER_JOURNAL_CLEAR: &str = "s-after-journal-clear";
pub const O_AFTER_DRAINED_SENT: &str = "o-after-drained-sent";
pub const O_AFTER_SEAL_FLOCK_RELEASED: &str = "o-after-seal-flock-released";
pub const O_AFTER_SEAL_COMPLETE_SENT: &str = "o-after-seal-complete-sent";
pub const O_AFTER_COMMIT_RECV: &str = "o-after-commit-recv";
}
#[inline]
pub fn maybe_crash(point: &str) {
if !cfg!(feature = "crash-points") {
let _ = point;
return;
}
let want = match std::env::var("HANDOFF_CRASH_AT") {
Ok(v) => v,
Err(_) => return,
};
if want != point {
return;
}
if let Ok(dir) = std::env::var("HANDOFF_CRASH_MARKER_DIR") {
let role = std::env::var("HANDOFF_CRASH_ROLE").unwrap_or_else(|_| "unknown".into());
let marker = std::path::Path::new(&dir).join(format!("crashed-{role}.marker"));
let _ = std::fs::write(&marker, point);
}
unsafe { libc::_exit(99) };
}