From e9189947044a7f836f1af5eb774aac2ac32dbaa8 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sun, 27 Jan 2019 18:33:17 -0800 Subject: [PATCH] test for RPRO/PUTF regression --- modules/database/test/std/rec/asyncproctest.c | 30 ++++++++++++++++++- .../database/test/std/rec/asyncproctest.db | 27 +++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/modules/database/test/std/rec/asyncproctest.c b/modules/database/test/std/rec/asyncproctest.c index a8b09a928..ac788c755 100644 --- a/modules/database/test/std/rec/asyncproctest.c +++ b/modules/database/test/std/rec/asyncproctest.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -16,6 +17,7 @@ #include #include "registryFunction.h" #include +#include epicsEventId done; static int waitFor; @@ -28,11 +30,17 @@ long doneSubr(subRecord *prec) return 0; } +static +void dummydone(void *usr, struct dbCommon* prec) +{ + epicsEventMustTrigger(done); +} + void asyncproctest_registerRecordDeviceDriver(struct dbBase *); MAIN(asyncproctest) { - testPlan(21); + testPlan(25); done = epicsEventMustCreate(epicsEventEmpty); @@ -99,6 +107,26 @@ MAIN(asyncproctest) testdbGetFieldEqual("chain3", DBF_LONG, 7); testdbGetFieldEqual("chain3.A", DBF_LONG, 2); + testDiag("===== Chain 4 ======"); + + { + dbCommon *dummy=testdbRecordPtr("chain4_dummy"); + + testdbPutFieldOk("chain4_pos.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"); + + testTodoBegin("Bug"); + testdbGetFieldEqual("chain4_pos", DBF_SHORT, 1); + testdbGetFieldEqual("chain4_rel", DBF_SHORT, 1); + testdbGetFieldEqual("chain4_lim", DBF_SHORT, 1); + testTodoEnd(); + } + testIocShutdownOk(); testdbCleanup(); diff --git a/modules/database/test/std/rec/asyncproctest.db b/modules/database/test/std/rec/asyncproctest.db index 352b6ca56..4f8a97522 100644 --- a/modules/database/test/std/rec/asyncproctest.db +++ b/modules/database/test/std/rec/asyncproctest.db @@ -53,3 +53,30 @@ record(sub, "done3") { field(FLNK, "chain3") field(TPRO, "$(TPRO=)") } + + +# loop breaking regression +# should _not_ RPRO +record(calcout,"chain4_pos") { + field(CALC, "E:=E+1;E") + field(OUT,"chain4_rel.A PP") + field(TPRO, "$(TPRO=)") +} + +record(calc,"chain4_rel") { + field(CALC, "E:=E+1;E") + field(FLNK,"chain4_lim") + field(TPRO, "$(TPRO=)") +} + +record(calc,"chain4_lim") { + field(CALC, "E:=E+1;E") + field(INPA,"chain4_pos PP") + field(INPB,"chain4_pos.HIGH PP") + field(INPC,"chain4_pos.LOW PP") + field(TPRO, "$(TPRO=)") +} + +record(bo, "chain4_dummy") { +field(TPRO, "$(TPRO=)") +}