use beamr::native::ProcessContext;
use beamr::term::Term;
use crate::RuntimeHandle;
pub(super) fn consume_wake_marker(process_context: &mut ProcessContext, runtime: &RuntimeHandle) {
if let Some(pid) = process_context.pid() {
runtime.nif_state().observe_native_entry(pid);
}
let markers = [
runtime.activity_complete_atom(),
runtime.activity_failed_atom(),
runtime.activity_result_atom(),
runtime.signal_received_atom(),
runtime.timer_fired_atom(),
runtime.query_marker_atom(),
runtime.child_terminal_atom(),
];
let Some(select) = process_context.select_facility() else {
return;
};
let message_count = select.message_count();
for index in 0..message_count {
let Some(message) = select.peek_message(index) else {
continue;
};
if markers.iter().any(|marker| message == Term::atom(*marker)) {
select.remove_message(index);
return;
}
}
tracing::warn!(
pid = ?process_context.pid(),
queued_messages = message_count,
"suspending await found no consumable aion wake marker in a non-empty mailbox"
);
}