From 5010ed983a92a2ef7acdf5abc3b10ad4d91a6eeb Mon Sep 17 00:00:00 2001 From: "benjamin.franksen" <benjamin.franksen@helmholtz-berlin.de> Date: Fri, 12 Jul 2013 19:09:02 +0000 Subject: [PATCH] seq: fixed connect and monitor accounting in seq_disconnect and seq_camonitor --- src/seq/seq_ca.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/seq/seq_ca.c b/src/seq/seq_ca.c index 6f64efc4..0ea24c90 100644 --- a/src/seq/seq_ca.c +++ b/src/seq/seq_ca.c @@ -360,8 +360,16 @@ void seq_disconnect(SPROG *sp) "%s\n", ch->varName, dbch->dbName, pvVarGetMess(dbch->pvid)); /* Clear monitor & connect indicators */ - dbch->connected = FALSE; - sp->connectCount -= 1; + if (dbch->connected) + { + dbch->connected = FALSE; + sp->connectCount--; + } + if (dbch->gotMonitor) + { + dbch->gotMonitor = FALSE; + sp->gotMonitorCount--; + } } epicsMutexUnlock(sp->programLock); @@ -371,6 +379,7 @@ void seq_disconnect(SPROG *sp) pvStat seq_camonitor(CHAN *ch, boolean turn_on) { DBCHAN *dbch = ch->dbch; + SPROG *sp = ch->sprog; pvStat status; assert(ch); @@ -378,7 +387,6 @@ pvStat seq_camonitor(CHAN *ch, boolean turn_on) if (turn_on == pvMonIsDefined(dbch->pvid)) /* no change */ return pvStatOK; DEBUG("calling pvVarMonitor%s(%p)\n", turn_on ? "On" : "Off", ch); - dbch->gotOneMonitor = FALSE; if (turn_on) { status = pvVarMonitorOn( @@ -388,7 +396,13 @@ pvStat seq_camonitor(CHAN *ch, boolean turn_on) ch); /* user arg (channel struct) */ } else + { status = pvVarMonitorOff(&dbch->pvid); + dbch->gotMonitor = FALSE; + epicsMutexMustLock(sp->programLock); + sp->gotMonitorCount -= 1; + epicsMutexUnlock(sp->programLock); + } if (status != pvStatOK) errlogSevPrintf(errlogFatal, "seq_camonitor: pvVarMonitor%s(var '%s', pv '%s') failure: %s\n", turn_on?"On":"Off", ch->varName, dbch->dbName, pvVarGetMess(dbch->pvid)); -- GitLab