use crate::{EbpfContext, cty::c_long, helpers::bpf_get_stackid};
pub(crate) mod sealed {
#[expect(unnameable_types, reason = "this is the sealed trait pattern")]
pub trait StackIdContext: super::EbpfContext {}
#[expect(unnameable_types, reason = "this is the sealed trait pattern")]
pub trait StackTraceMap {
fn as_ptr(&self) -> *mut core::ffi::c_void;
}
}
pub trait StackIdContext: sealed::StackIdContext {
fn get_stackid<M: StackTraceMap>(&self, map: &M, flags: u64) -> Result<c_long, i32> {
let ret = unsafe { bpf_get_stackid(self.as_ptr(), map.as_ptr(), flags) };
if ret < 0 { Err(ret as i32) } else { Ok(ret) }
}
}
impl<T: sealed::StackIdContext> StackIdContext for T {}
pub trait StackTraceMap: sealed::StackTraceMap {}
impl<T: sealed::StackTraceMap> StackTraceMap for T {}
macro_rules! impl_stack_id_context {
($($ty:ty),+ $(,)?) => {
$(
impl sealed::StackIdContext for $ty {}
)+
};
}
impl_stack_id_context!(
crate::programs::probe::ProbeContext,
crate::programs::retprobe::RetProbeContext,
crate::programs::tracepoint::TracePointContext,
crate::programs::raw_tracepoint::RawTracePointContext,
crate::programs::tp_btf::BtfTracePointContext,
crate::programs::perf_event::PerfEventContext,
crate::programs::fentry::FEntryContext,
crate::programs::fexit::FExitContext,
crate::programs::lsm::LsmContext,
);