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