pub enum RecordProcessResult {
Complete,
AsyncPending,
AsyncPendingNotify(Vec<(String, EpicsValue)>),
CompleteNoEmit,
CompleteDeferOutput,
CompleteAlarmOnly,
}Expand description
Result of a record’s process() call.
Determines how the framework handles the current processing cycle.
Side-effect actions (link writes, delayed reprocess, etc.) are expressed
separately in ProcessOutcome::actions.
Variants§
Complete
Processing completed synchronously this cycle. Framework proceeds with alarm/timestamp/snapshot/OUT/FLNK.
AsyncPending
Processing started but not yet complete (PACT stays set). Current cycle skips alarm/timestamp/snapshot/OUT/FLNK. ProcessActions (if any) are still executed.
AsyncPendingNotify(Vec<(String, EpicsValue)>)
Async pending, but notify these intermediate field changes immediately. Used by motor records to flush DMOV=0 before the move completes.
CompleteNoEmit
Completed synchronously (PACT cleared, unlike AsyncPending), but the
record produced no new value to publish this cycle — the framework must
skip the value-publication epilogue (UDF clear / timestamp / monitor /
FLNK). C parity compressRecord.c:365 if (status != 1): a compress
record still accumulating toward its next compressed sample runs none of
recGblGetTimeStamp / monitor / recGblFwdLink on that cycle.
CompleteDeferOutput
Ran the value-publication epilogue NOW (UDF clear / timestamp / monitor —
VAL and the alarm fields are posted this cycle), but the OUTPUT side (OUT
link write / OEVT / forward link) is deferred to a scheduled
reprocess, with PACT held across the wait. C parity swaitRecord.c::process
(lines 425-481): when schedOutput arms the ODLY watchdog it sets
async=TRUE, so process still runs monitor() (line 475) — posting the
value side at the START of the delay — but skips the if(!async) {recGblFwdLink; pact=FALSE;} tail; the deferred execOutput (watchdog,
at delay-END) does the OUT write + OEVT + forward link and posts no
monitors. Unlike the calcout/scalcout/acalcout family, whose C process
returns BEFORE monitor() (calcoutRecord.c:282, only dlya posted), so
they defer the value side too and use AsyncPendingNotify. The deferral
must carry a ProcessAction::ReprocessAfter — that scheduled reprocess
is the continuation that releases the held PACT (same by-construction
invariant as the AsyncPendingNotify ODLY defer).
CompleteAlarmOnly
Completed synchronously (PACT cleared), and the framework runs the ALARM
epilogue ONLY: the UDF update, check_alarms, recGblResetAlarms
(committing SEVR/STAT/AMSG and posting those fields with their C masks)
and the timestamp. The VALUE side is skipped entirely — no monitor()
value posts (so the last-posted trackers stay put and the next publishing
cycle re-detects the change, exactly as C leaves LA..LP un-updated), no
OUT / OEVT write, no process actions, no forward link.
C parity transformRecord.c:554-560: an INVALID input severity with
IVLA == transformIVLA_DO_NOTHING makes process() run
recGblGetTimeStamp + checkAlarms + recGblResetAlarms, clear pact
and return — skipping the calc loop, all 16 OUTx dbPutLink writes,
monitor() and recGblFwdLink().
Distinct from RecordProcessResult::CompleteNoEmit, which skips the
alarm commit and the timestamp too (C compressRecord.c:365 returns
before checkAlarms).
Trait Implementations§
Source§impl Clone for RecordProcessResult
impl Clone for RecordProcessResult
Source§fn clone(&self) -> RecordProcessResult
fn clone(&self) -> RecordProcessResult
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more