From bb3e7e67ee7dc570fc6cb7f2fb502e4f4266997d Mon Sep 17 00:00:00 2001 From: "benjamin.franksen" <benjamin.franksen@helmholtz-berlin.de> Date: Wed, 10 Jul 2013 15:11:54 +0000 Subject: [PATCH] seq: fixed a corner case in ASYNC put/get If epicsEventTryWait succeeds, there could still be a previous request pending that has timed out. This happens e.g. if the user code did not call pvGetComplete resp. pvPutComplete. In that case we must reset the request pointer to NULL in order to invalidate the request so it gets ignored whenever it finally arrives. --- src/seq/seq_if.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/seq/seq_if.c b/src/seq/seq_if.c index 894b5318..6e17a1e5 100644 --- a/src/seq/seq_if.c +++ b/src/seq/seq_if.c @@ -120,6 +120,12 @@ epicsShareFunc pvStat epicsShareAPI seq_pvGet(SS_ID ss, VAR_ID varId, enum compT switch (epicsEventTryWait(getSem)) { case epicsEventWaitOK: + if (ss->getReq[varId] != NULL) + { + /* previous request timed out but user + did not call pvGetComplete */ + ss->getReq[varId] = NULL; + } status = check_connected(dbch, meta); if (status) return epicsEventSignal(getSem), status; break; @@ -392,6 +398,12 @@ epicsShareFunc pvStat epicsShareAPI seq_pvPut(SS_ID ss, VAR_ID varId, enum compT switch (epicsEventTryWait(putSem)) { case epicsEventWaitOK: + if (ss->putReq[varId] != NULL) + { + /* previous request timed out but user + did not call pvPutComplete */ + ss->putReq[varId] = NULL; + } break; case epicsEventWaitTimeout: meta->status = pvStatERROR; -- GitLab