CP link triggers lost when record is async
Affects | Status | Importance | Assigned to | Milestone | ||
---|---|---|---|---|---|---|
EPICS Base | Status tracked in 7.0 | |||||
7.0 |
Confirmed
|
High
|
Unassigned |
Bug Description
From Benjamin Franksen:
Here is a small self-contained database to reproduce this:
record(
field(
field(
field(ODLY,"1")
field(
}
record(
field(
field(
field(CALC,"A")
field(TPRO,1)
}
record(
field(
field(
field(
}
Processing "input" (caput input.PROC 1) starts the test. The "check"
record should eventually settle to 1 (but doesn't).
With 7.0.3 I get this output:
scanOnce: dbProcess of 'output' # initial CPP processing
scanOnce: dbProcess of 'output'
scanOnce: dbProcess of Active 'output' with RPRO=0
scanOnce: dbProcess of 'output'
scanOnce: dbProcess of Active 'output' with RPRO=0
Note how this says "with RPRO=0".
And camonitor says:
franksen@tiber: ~ > camonitor input output check
input <undefined> 0 UDF INVALID
output 2019-08-27 16:02:16.106413 0
check 2019-08-27 16:02:16.106617 1
input 2019-08-27 16:02:26.498483 1
check 2019-08-27 16:02:26.498721 0
input 2019-08-27 16:02:27.493734 2
output 2019-08-27 16:02:27.993908 1
input 2019-08-27 16:02:28.489068 3
input 2019-08-27 16:02:29.484350 4
output 2019-08-27 16:02:29.984458 3
I think the difference in behavior between processing due to a CPP
input link versus processing due to a PP or CA output link is quite
surprising.
tags: | removed: codeathon |
One way to fix this might be to replicate the scanOnce queue but have the active end check PACT and set RPRO if the record is busy at the time, like dbPutField() does. One question would be whether the resulting queue ("scanForce" maybe?) should become part of dbScan or just live in dbCa.c.