diff --git a/src/seq/seqCom.h b/src/seq/seqCom.h index 37ec9a1f8a41e47b1cd5120ff8d8d75cf38712ef..ad99b3e9246bb33411efcc148b8bc311b5b9cc46 100644 --- a/src/seq/seqCom.h +++ b/src/seq/seqCom.h @@ -89,6 +89,8 @@ epicsShareFunc seqBool seq_pvGetComplete(SS_ID, VAR_ID, unsigned, seqBool, seqBool*); epicsShareFunc seqBool seq_pvPutComplete(SS_ID, VAR_ID, unsigned, seqBool, seqBool*); +epicsShareFunc void seq_pvGetCancel(SS_ID, VAR_ID, unsigned); +epicsShareFunc void seq_pvPutCancel(SS_ID, VAR_ID, unsigned); epicsShareFunc pvStat seq_pvAssign(SS_ID, VAR_ID, const char *); epicsShareFunc pvStat seq_pvMonitor(SS_ID, VAR_ID); epicsShareFunc void seq_pvSync(SS_ID, VAR_ID, unsigned, EV_ID); diff --git a/src/seq/seq_if.c b/src/seq/seq_if.c index 71c62bffafb52ea70a4b5930fb9a6c1e7a0ecb8b..ce1625fecf67419d68ef46c819b59ccfde0ab3ae 100644 --- a/src/seq/seq_if.c +++ b/src/seq/seq_if.c @@ -297,6 +297,37 @@ epicsShareFunc boolean seq_pvGetComplete( return any?anyDone:allDone; } +/* + * Cancel the last asynchronous get request. + */ +epicsShareFunc void seq_pvGetCancel( + SS_ID ss, + VAR_ID varId, + unsigned length) +{ + PROG *sp = ss->prog; + unsigned n; + + for (n = 0; n < length; n++) + { + epicsEventId getSem = ss->getSem[varId+n]; + CHAN *ch = ss->prog->chan + varId + n; + + if (!ch->dbch) + { + if (!optTest(sp, OPT_SAFE)) + errlogSevPrintf(errlogMinor, + "pvGetCancel(%s): user error (variable not assigned)\n", + ch->varName); + } + else + { + ss->getReq[varId] = NULL; + epicsEventSignal(getSem); + } + } +} + /* -------------------------------------------------------------------------- */ struct putq_cp_arg { @@ -615,6 +646,37 @@ epicsShareFunc boolean seq_pvPutComplete( return any?anyDone:allDone; } +/* + * Cancel the last asynchronous put request. + */ +epicsShareFunc void seq_pvPutCancel( + SS_ID ss, + VAR_ID varId, + unsigned length) +{ + PROG *sp = ss->prog; + unsigned n; + + for (n = 0; n < length; n++) + { + epicsEventId putSem = ss->putSem[varId+n]; + CHAN *ch = ss->prog->chan + varId + n; + + if (!ch->dbch) + { + if (!optTest(sp, OPT_SAFE)) + errlogSevPrintf(errlogMinor, + "pvPutCancel(%s): user error (variable not assigned)\n", + ch->varName); + } + else + { + ss->putReq[varId] = NULL; + epicsEventSignal(putSem); + } + } +} + /* -------------------------------------------------------------------------- */ /* diff --git a/src/snc/builtin.c b/src/snc/builtin.c index ada599be98afbcc091ee5edb44790f33b667aba6..7d666fffc4e3132a275630e3f7d6cc08f26095fb 100644 --- a/src/snc/builtin.c +++ b/src/snc/builtin.c @@ -68,6 +68,7 @@ static struct func_symbol func_symbols[] = {"pvFlushQ", FT_PV, FALSE, 0, FALSE, FALSE, FALSE}, {"pvFreeQ", FT_PV, FALSE, 0, FALSE, FALSE, FALSE}, {"pvGet", FT_PV, FALSE, 1, FALSE, FALSE, FALSE}, + {"pvGetCancel", FT_PV, TRUE, 0, FALSE, FALSE, FALSE}, {"pvGetComplete", FT_PV, TRUE, 2, FALSE, FALSE, FALSE}, {"pvGetQ", FT_PV, FALSE, 0, FALSE, FALSE, FALSE}, {"pvIndex", FT_PV, FALSE, 0, FALSE, FALSE, FALSE}, @@ -75,6 +76,7 @@ static struct func_symbol func_symbols[] = {"pvMonitor", FT_PV, FALSE, 0, FALSE, FALSE, FALSE}, {"pvName", FT_PV, FALSE, 0, FALSE, FALSE, FALSE}, {"pvPut", FT_PV, FALSE, 1, FALSE, FALSE, FALSE}, + {"pvPutCancel", FT_PV, TRUE, 0, FALSE, FALSE, FALSE}, {"pvPutComplete", FT_PV, TRUE, 2, FALSE, FALSE, FALSE}, {"pvSeverity", FT_PV, FALSE, 0, FALSE, FALSE, FALSE}, {"pvStatus", FT_PV, FALSE, 0, FALSE, FALSE, FALSE},