use super::core::TapEvent;
use super::ids;
use crate::global::const_dsl::{ScopeId, ScopeKind};
#[inline(always)]
pub(crate) const fn lane_acquire(rv_id: u32, sid: u32, lane: u16) -> TapEvent {
let rv_lane = (rv_id << 16) | (lane as u32);
TapEvent::new(0, ids::LANE_ACQUIRE, 0, sid, rv_lane)
}
#[inline(always)]
pub(crate) const fn lane_release(rv_id: u32, sid: u32, lane: u16) -> TapEvent {
let rv_lane = (rv_id << 16) | (lane as u32);
TapEvent::new(0, ids::LANE_RELEASE, 0, sid, rv_lane)
}
#[inline(always)]
pub(crate) const fn route_arm_selection_with_causal(
causal: u16,
sid: u32,
scope_id: ScopeId,
arm: u8,
) -> TapEvent {
let arg1 = ((route_site(scope_id) as u32) << 16) | (arm as u32);
TapEvent::new(0, ids::ROUTE_ARM_SELECTION, causal, sid, arg1)
}
#[inline(always)]
pub(crate) const fn resolver_audit(
lane: u8,
sid: u32,
scope_id: ScopeId,
resolver_id: u16,
result: u8,
) -> TapEvent {
let causal = TapEvent::make_causal_key(lane, result);
let arg1 = ((route_site(scope_id) as u32) << 16) | (resolver_id as u32);
TapEvent::new(0, ids::RESOLVER_AUDIT, causal, sid, arg1)
}
#[inline(always)]
const fn route_site(scope_id: ScopeId) -> u16 {
if !matches!(scope_id.kind(), Some(ScopeKind::Route)) {
crate::invariant();
}
scope_id.local_ordinal()
}
#[inline(always)]
pub(crate) const fn raw_event(id: u16) -> TapEvent {
TapEvent::new(0, id, 0, 0, 0)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn route_site_evidence_uses_scope_local_ordinal() {
let first = route_arm_selection_with_causal(2, 3, ScopeId::route(0), 1);
let second = route_arm_selection_with_causal(2, 3, ScopeId::route(1), 1);
assert_eq!(first.arg1() >> 16, 0);
assert_eq!(second.arg1() >> 16, 1);
assert_eq!(first.arg1() & 0xffff, 1);
assert_eq!(second.arg1() & 0xffff, 1);
let first_audit = resolver_audit(7, 3, ScopeId::route(0), 77, 0);
let second_audit = resolver_audit(7, 3, ScopeId::route(1), 77, 0);
assert_eq!(first_audit.arg1() >> 16, 0);
assert_eq!(second_audit.arg1() >> 16, 1);
assert_eq!(first_audit.arg1() & 0xffff, 77);
assert_eq!(second_audit.arg1() & 0xffff, 77);
assert_eq!(first_audit.causal_key(), second_audit.causal_key());
}
#[test]
#[should_panic]
fn route_site_rejects_non_route_scope() {
let _ = route_arm_selection_with_causal(2, 3, ScopeId::roll_scope(0), 1);
}
#[test]
#[should_panic]
fn route_site_rejects_out_of_domain_scope() {
let _ = route_arm_selection_with_causal(2, 3, ScopeId::route(ScopeId::LOCAL_CAPACITY), 1);
}
}