Skip to main content

ProcessAction

Enum ProcessAction 

Source
pub enum ProcessAction {
    WriteDbLink {
        link_field: &'static str,
        value: EpicsValue,
    },
    ResolveOutTarget {
        link_field: &'static str,
    },
    ReadDbLink {
        link_field: &'static str,
        target_field: &'static str,
    },
    ReprocessAfter(Duration),
    ScanOnce,
    DeviceCommand {
        command: &'static str,
        args: Vec<EpicsValue>,
    },
    WriteDbLinkNotify {
        link_field: &'static str,
        value: EpicsValue,
    },
    ArmWatchdog,
    CancelReprocess,
}
Expand description

Side-effect actions that a record requests from the processing framework.

Records return these from process() via ProcessOutcome::actions. The framework executes them at the appropriate point in the processing cycle, keeping records as pure state machines without direct DB access.

Variants§

Write a value to a DB link. The framework reads link_field from the record to get the target PV name, then writes value to that PV.

Executed after alarm/snapshot, before FLNK. Example: scaler writes CNT to COUT/COUTP links.

Fields

§link_field: &'static str
§

ResolveOutTarget

Resolve an OUT link’s TARGET (OutTarget) and hand it to the record through Record::set_resolved_out_target, BEFORE process() runs.

Pre-process action — the OUT-link twin of Self::ReadDbLink, and C’s checkLinks-cached lnk_field_type: a record whose fire-time branch depends on the target’s DBF class (sseq decides the wire buffer AND whether a WAITn put-callback is issued from the one switch, sseqRecord.c:714-792) must have the class in hand when it decides, not after the framework’s put path has already been entered.

Fields

§link_field: &'static str

Read a value from a DB link into a record field. The framework reads link_field from the record to get the source PV name, reads that PV, and writes the result into target_field via an internal put that bypasses read-only checks.

The value delivered is the link target’s native EpicsValue — it is NOT coerced to a numeric type on the way in. The record coerces (or preserves) it at its own put_field/put_field_internal boundary, so a string-class source can reach a string field byte-exact (the sseq DOLnSTRn path, C sseqRecord.c:643-705). Records whose target_field is numeric simply convert there, exactly as before.

Pre-process action: executed BEFORE the next process() cycle so the value is immediately available. This matches C EPICS dbGetLink() which is synchronous/immediate.

Example: throttle reads SINP into VAL when SYNC is triggered.

Fields

§link_field: &'static str
§target_field: &'static str
§

ReprocessAfter(Duration)

Schedule a re-process of this record after the given duration. The framework spawns tokio::spawn(sleep(d) + process_record(name)). The current cycle’s OUT/FLNK/notify proceed normally.

Equivalent to C EPICS callbackRequestDelayed() + scanOnce().

§

ScanOnce

C scanOnce(precord) — queue ONE process of this record, now.

A record’s special() emits this when a put changed state the record must act on but the put itself will not process the record. C guards every such call with if (precord->scan) — scaler special() (scalerRecord.c:655 CNT, :667 CONT), whose comment is exactly the contract: “Scan record if it’s not Passive. (If it’s Passive, it’ll get scanned automatically, since .cnt is a Process-Passive field.)”

The FRAMEWORK owns that gate, not the record: the framework owns SCAN and owns the pp(TRUE) reprocess decision (dbPutField, dbAccess.c:1265-1268), and a record’s special() cannot see either. So a record emits ScanOnce unconditionally wherever C calls scanOnce, and the executor drops it for a Passive record — where the put’s own process already covers it and a second one would double-process.

Queued, not inline: C’s scanOnce hands the record to the scan-once thread, which takes dbScanLock — so the process lands after the putting thread leaves dbPutField.

§

DeviceCommand

Send a named command to the device support driver. The framework calls DeviceSupport::handle_command() with this data. Used by scaler to request reset/arm/write_preset operations without the record holding a direct driver reference.

Fields

§command: &'static str
§

WriteDbLinkNotify

Write a value to a DB link as a put-with-completion, then re-enter THIS record’s process() when the downstream operation completes.

The framework arms a put-notify wait-set (C dbProcessNotify), writes link_field’s target through it, releases the initiator’s own count, and wires the completion to an async re-entry of this record (mint_async_token + reprocess_on_notify). The record returns RecordProcessResult::AsyncPending alongside this action and is re-entered once the downstream record (and its FLNK/OUT chain) finishes — the synApps sseq WAITn “wait for the put callback” dependency (sseqRecord.c::processNextLink, dbCaPutLinkCallback). Built on the same new_put_notify + reprocess_on_notify primitive an out-of-band crate::server::database::AsyncDbHandle caller uses.

Executed before FLNK, like Self::WriteDbLink.

Fields

§link_field: &'static str
§

ArmWatchdog

(Re)arm this record’s monitor watchdog — C histogramRecord.c::wdogInit (:126-152), whose callbackRequestDelayed(&pcallback->callback, prec->sdel) starts (or restarts) the periodic Record::watchdog_fire tick.

Emitted from a record’s special() when the put changed the watchdog’s period (histogram SDEL is special(SPC_RESET) precisely so it can re-arm, histogramRecord.c:266-268). The framework also arms every record’s watchdog once at iocInit, which is C’s other wdogInit call site (init_record pass 1, :168).

Arming supersedes any tick already pending for the record, exactly as C’s callbackRequestDelayed replaces an outstanding delayed callback.

§

CancelReprocess

Cancel this record’s outstanding async re-entry (C callbackCancelDelayed): the framework advances the record’s re-entry generation so any pending ReprocessAfter timer or WriteDbLinkNotify completion re-entry becomes a structural no-op (the AsyncToken gate), with no runtime “is-aborted” check on the re-entry path. Used by sseq ABORT to drop a pending DLYn delay or WAITn wait; the record resets its own sequence state in the same process() cycle that emits this.

Trait Implementations§

Source§

impl Clone for ProcessAction

Source§

fn clone(&self) -> ProcessAction

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ProcessAction

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for ProcessAction

Source§

fn eq(&self, other: &ProcessAction) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for ProcessAction

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more