use crate::FrameFlags;
pub const INLINE_PAYLOAD_SIZE: usize = 16;
pub const INLINE_PAYLOAD_SLOT: u32 = u32::MAX;
pub const NO_DEADLINE: u64 = u64::MAX;
#[derive(Clone, Copy)]
#[repr(C, align(64))]
pub struct MsgDescHot {
pub msg_id: u64,
pub channel_id: u32,
pub method_id: u32,
pub payload_slot: u32,
pub payload_generation: u32,
pub payload_offset: u32,
pub payload_len: u32,
pub flags: FrameFlags,
pub credit_grant: u32,
pub deadline_ns: u64,
pub inline_payload: [u8; INLINE_PAYLOAD_SIZE],
}
const _: () = assert!(core::mem::size_of::<MsgDescHot>() == 64);
impl MsgDescHot {
pub const fn new() -> Self {
Self {
msg_id: 0,
channel_id: 0,
method_id: 0,
payload_slot: INLINE_PAYLOAD_SLOT,
payload_generation: 0,
payload_offset: 0,
payload_len: 0,
flags: FrameFlags::empty(),
credit_grant: 0,
deadline_ns: NO_DEADLINE,
inline_payload: [0; INLINE_PAYLOAD_SIZE],
}
}
#[inline]
pub const fn has_deadline(&self) -> bool {
self.deadline_ns != NO_DEADLINE
}
#[inline]
pub fn is_expired(&self, now_ns: u64) -> bool {
self.deadline_ns != NO_DEADLINE && now_ns > self.deadline_ns
}
#[inline]
pub const fn is_inline(&self) -> bool {
self.payload_slot == INLINE_PAYLOAD_SLOT
}
#[inline]
pub const fn is_control(&self) -> bool {
self.channel_id == 0
}
#[inline]
pub fn inline_payload(&self) -> &[u8] {
&self.inline_payload[..self.payload_len as usize]
}
}
impl Default for MsgDescHot {
fn default() -> Self {
Self::new()
}
}
impl core::fmt::Debug for MsgDescHot {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("MsgDescHot")
.field("msg_id", &self.msg_id)
.field("channel_id", &self.channel_id)
.field("method_id", &self.method_id)
.field("payload_slot", &self.payload_slot)
.field("payload_generation", &self.payload_generation)
.field("payload_offset", &self.payload_offset)
.field("payload_len", &self.payload_len)
.field("flags", &self.flags)
.field("credit_grant", &self.credit_grant)
.field("deadline_ns", &self.deadline_ns)
.field("is_inline", &self.is_inline())
.finish()
}
}
#[derive(Debug, Clone, Copy, Default)]
#[repr(C, align(64))]
pub struct MsgDescCold {
pub msg_id: u64,
pub trace_id: u64,
pub span_id: u64,
pub parent_span_id: u64,
pub timestamp_ns: u64,
pub debug_level: u32,
pub _reserved: u32,
}
const _: () = assert!(core::mem::size_of::<MsgDescCold>() == 64);