pub struct DeferredNotifyPut {
pub field: String,
pub value: EpicsValue,
pub completion: Sender<()>,
}Expand description
A put-notify (dbPutNotify — CA WRITE_NOTIFY, caput -c) that landed on a
PACT record and was therefore deferred WHOLE.
C processNotifyCommon (dbNotify.c:225-231) tests precord->pact above
ppn->putCallback, so nothing is written and nothing is marked: the record
joins the notify’s wait list in state notifyRestartInProgress, and when the
async cycle completes the put is replayed against a record that is no longer
active — value written, record processed, callback fired only after THAT
process finishes. So a client’s “callback returned” still means “the value I
sent has been processed”.
softIoc 7.0.10.1-DEV, ASY (calcout, ODLY=4, A=5), caput -c ASY.A 7
issued 1 s into the async cycle:
t=1s A=5 PACT=1 <- cycle in flight
t=2s A=5 PACT=1 RPRO=0 <- put-notify pending: nothing written
t=4s A=7 PACT=1 <- cycle done; the put is replayed
callback returns at t=6.9s: A=7 VAL=7 <- after the RESTARTED processFields§
§field: StringThe field the client wrote (already upper-cased).
value: EpicsValueThe value it wrote — held here, unwritten, until the restart.
completion: Sender<()>The client’s completion channel. The replayed put builds its wait-set around this sender, so the callback fires on the restarted process, not on the in-flight cycle.