diff --git a/modules/database/src/ioc/db/dbDbLink.c b/modules/database/src/ioc/db/dbDbLink.c index d53e1568c..74f522fbd 100644 --- a/modules/database/src/ioc/db/dbDbLink.c +++ b/modules/database/src/ioc/db/dbDbLink.c @@ -387,7 +387,7 @@ static long processTarget(dbCommon *psrc, dbCommon *pdst) char context[40] = ""; int trace = dbAccessDebugPUTF && *dbLockSetAddrTrace(psrc); int srcset = dbRec2Pvt(psrc)->procThread==NULL; - int dstset = dbRec2Pvt(pdst)->procThread==NULL; + int dstset = psrc!=pdst && dbRec2Pvt(pdst)->procThread==NULL; long status; epicsUInt8 pact = psrc->pact; epicsThreadId self = epicsThreadGetIdSelf(); @@ -411,7 +411,7 @@ static long processTarget(dbCommon *psrc, dbCommon *pdst) pdst->putf = psrc->putf; } - else if (psrc->putf && dbRec2Pvt(pdst)->procThread!=self) { + else if (psrc->putf && dstset) { /* The dst record is busy (awaiting async reprocessing), * not being processed recursively by us, and * we were originally triggered by a call to dbPutField(), diff --git a/modules/database/test/std/rec/asyncproctest.c b/modules/database/test/std/rec/asyncproctest.c index b10bcac68..7b8fca782 100644 --- a/modules/database/test/std/rec/asyncproctest.c +++ b/modules/database/test/std/rec/asyncproctest.c @@ -40,7 +40,7 @@ void asyncproctest_registerRecordDeviceDriver(struct dbBase *); MAIN(asyncproctest) { - testPlan(25); + testPlan(27); done = epicsEventMustCreate(epicsEventEmpty); @@ -125,6 +125,22 @@ MAIN(asyncproctest) testdbGetFieldEqual("chain4_lim", DBF_SHORT, 1); } + testDiag("===== Chain 5 ======"); + + { + dbCommon *dummy=testdbRecordPtr("chain4_dummy"); + + testdbPutFieldOk("chain5_cnt.PROC", DBF_LONG, 0); + + /* sync once queue to wait for any queued RPRO */ + scanOnceCallback(dummy, dummydone, NULL); + + if (epicsEventWaitWithTimeout(done, 10.0) != epicsEventOK) + testAbort("Processing timed out"); + + testdbGetFieldEqual("chain5_cnt", DBF_SHORT, 1); + } + testIocShutdownOk(); testdbCleanup(); diff --git a/modules/database/test/std/rec/asyncproctest.db b/modules/database/test/std/rec/asyncproctest.db index 4f8a97522..021506512 100644 --- a/modules/database/test/std/rec/asyncproctest.db +++ b/modules/database/test/std/rec/asyncproctest.db @@ -80,3 +80,11 @@ record(calc,"chain4_lim") { record(bo, "chain4_dummy") { field(TPRO, "$(TPRO=)") } + +# loop breaking regression part 2 +# selft link should _not_ RPRO +record(calcout,"chain5_cnt") { + field(CALC, "E:=E+1;E") + field(OUT,"chain5_cnt.A PP") + field(TPRO, "$(TPRO=)") +}