Warning: 'Busy.PUTF' found true with PACT false
Affects | Status | Importance | Assigned to | Milestone | ||
---|---|---|---|---|---|---|
EPICS Base | Status tracked in 7.0 | |||||
7.0 |
Fix Released
|
High
|
mdavidsaver |
Bug Description
From Mark Rivers:
I have now reproduced the problem with a simple 6 record database (attached). This database can be run on any IOC that is built with the busy record. A simple one is busy/busyApp/
The database works as follows:
bo record Acquire. Writing 1 to this record is what will trigger the problem.
bi record Acquire_RBV. This record is written to by Acquire. It is set to 0 by Reset. It is monitored by ClearBusy.
calcout record SetBusy. This record is FLNKd by Acquire and gets its value from Acquire. On transition to 1 it sets Busy to 1. It FNLKs to Reset.
busy record Busy. The value 1 is written to this record by SetBusy and the value 0 is written to it by ClearBusy. The busy record is basically a clone of the bo record except that it only calls RecGblFwdLink when its value is 0.
seq record Reset. This record processed when 1 is written to Busy. It has a delay of 1 second, and after that time it writes 0 to Acquire_RBV. It is disabled if Busy is 0 to avoid infinite loop.
calcout record ClearBusy. This record monitors Acquire_RBV. On that PV transitioning from 1 to 0 it writes 0 to the Busy record. I believe it is this write operation that is causing the error in EPICS base.
This is the error from EPICS base 7.0.2 after I also added a call to epicsStaceTrace() in addition to the errlogPrintf.
epics> Dumping a stack trace of thread 'scanOnce':
[ 0x7f49751f113b]: /usr/local/
[ 0x7f49756b7057]: /usr/local/
[ 0x7f49756bac19]: /usr/local/
[ 0x7f497592f8a8]: /usr/local/
[ 0x7f497592ff29]: /usr/local/
[ 0x7f49756a91c8]: /usr/local/
[ 0x7f49756bcb37]: /usr/local/
[ 0x7f49751eb7bc]: /usr/local/
[ 0x7f49743aae25]: /lib64/
[ 0x7f49746bdbad]: /lib64/
Warning: 'testBusyAsyn:
https:/ /epics. anl.gov/ core-talk/ 2018/msg00911. php
I think the warning you see has served its purpose and can be removed,
or made conditional on dbAccessDebugPUTF. This condition is inevitable
if record support process() is allowed to return PACT=0 without
calling recGblFwdLink()
The real issue is that you should be seeing this warning both with and
without '-c'. That you do not is a symptom of dbNotify never setting PUTF.
While it wasn't immediately clear to me, dbPutField() is only used for link fields.
In other cases, the logic of dbPutField() is partially replicated in dbNotify.c
with calls to dbPut() and dbProcess().