use bb_ir::proto::onnx::NodeProto;
use bb_runtime::atomic::DispatchResult;
use bb_runtime::bus::OpError;
use bb_runtime::runtime::RuntimeResourceRef;
use bb_runtime::slot_value::SlotValue;
use bb_runtime::syscall::values::TriggerValue;
pub struct DeadlineMatchOp;
pub const DOMAIN: &str = "ai.bytesandbrains.syscall";
pub const OP_TYPE: &str = "DeadlineMatch";
pub fn invoke(
_node: &NodeProto,
inputs: &[(&str, &dyn SlotValue)],
ctx: &mut RuntimeResourceRef<'_>,
) -> Result<DispatchResult, OpError> {
if inputs.is_empty() {
return Err(OpError {
detail: "DeadlineMatch requires at least one input".to_string(),
..Default::default()
});
}
let latch_key = (ctx.current.op_ref.as_u64(), ctx.current.exec_id.as_u64());
if !ctx.syscall.deadline_match_fired.insert(latch_key) {
return Ok(DispatchResult::Immediate(vec![]));
}
Ok(DispatchResult::Immediate(vec![(
"winner".to_string(),
Box::new(TriggerValue),
)]))
}
use bb_runtime::registry::OpRegistration as _BbOpsSyscallReg;
inventory::submit! {
_BbOpsSyscallReg {
domain: DOMAIN,
op_type: OP_TYPE,
invoke,
kind: bb_runtime::registry::RegistrationKind::Syscall,
}
}