diff --git a/src/seq/seqPvt.h b/src/seq/seqPvt.h index b52b9ffa2871cd226336aa1b6acee200b0889a34..bf25bf48f9b99f853ad20a8b491c05240dbff1a9 100644 --- a/src/seq/seqPvt.h +++ b/src/seq/seqPvt.h @@ -127,7 +127,7 @@ struct db_channel pvVar pvid; /* PV (process variable) id */ unsigned dbCount; /* actual count for db access */ boolean connected; /* whether channel is connected */ - boolean gotOneMonitor; /* whether got at least one monitor */ + boolean gotMonitor; /* whether we got a monitor after connect */ PVMETA metaData; /* meta data (shared buffer) */ PVMETA *ssMetaData; /* array of meta data, one for each state set (safe mode) */ @@ -196,8 +196,8 @@ struct program_instance unsigned assignCount; /* number of channels assigned to ext. pv */ unsigned connectCount; /* number of channels connected */ unsigned monitorCount; /* number of channels monitored */ - unsigned firstMonitorCount; /* number of channels that received - at least one monitor event */ + unsigned gotMonitorCount;/* number of monitored channels that got + a monitor event */ void *pvReqPool; /* freeList for pv requests (has own lock) */ boolean die; /* flag set when seqStop is called */ diff --git a/src/seq/seq_ca.c b/src/seq/seq_ca.c index 9fac1bc8db4fa4259a2794d6031b7bb232cdf96b..6f64efc4c7d371cca9d92a4e06b1be79a32ed78b 100644 --- a/src/seq/seq_ca.c +++ b/src/seq/seq_ca.c @@ -102,7 +102,7 @@ pvStat seq_connect(SPROG *sp, boolean wait) ac = sp->assignCount; mc = sp->monitorCount; cc = sp->connectCount; - gmc = sp->firstMonitorCount; + gmc = sp->gotMonitorCount; epicsMutexUnlock(sp->programLock); ready = ac == cc && mc == gmc; @@ -189,12 +189,12 @@ static void seq_mon_handler( assert(dbch != NULL); proc_db_events(value, type, ch, 0, pvEventMonitor, status); - if (!dbch->gotOneMonitor) + if (!dbch->gotMonitor) { - dbch->gotOneMonitor = TRUE; + dbch->gotMonitor = TRUE; epicsMutexMustLock(sp->programLock); - sp->firstMonitorCount++; - if (sp->firstMonitorCount == sp->monitorCount + sp->gotMonitorCount++; + if (sp->gotMonitorCount == sp->monitorCount && sp->connectCount == sp->assignCount) { epicsEventSignal(sp->ready); @@ -368,28 +368,30 @@ void seq_disconnect(SPROG *sp) pvSysFlush(sp->pvSys); } -pvStat seq_camonitor(CHAN *ch, boolean on) +pvStat seq_camonitor(CHAN *ch, boolean turn_on) { DBCHAN *dbch = ch->dbch; pvStat status; assert(ch); assert(dbch); - if (on == pvMonIsDefined(dbch->pvid)) /* already done */ + if (turn_on == pvMonIsDefined(dbch->pvid)) /* no change */ return pvStatOK; - DEBUG("calling pvVarMonitor%s(%p)\n", on?"On":"Off", dbch->pvid); + DEBUG("calling pvVarMonitor%s(%p)\n", turn_on ? "On" : "Off", ch); dbch->gotOneMonitor = FALSE; - if (on) + if (turn_on) + { status = pvVarMonitorOn( &dbch->pvid, /* pvid */ ch->type->getType, /* requested type */ ch->count, /* element count */ ch); /* user arg (channel struct) */ + } else status = pvVarMonitorOff(&dbch->pvid); if (status != pvStatOK) errlogSevPrintf(errlogFatal, "seq_camonitor: pvVarMonitor%s(var '%s', pv '%s') failure: %s\n", - on?"On":"Off", ch->varName, dbch->dbName, pvVarGetMess(dbch->pvid)); + turn_on?"On":"Off", ch->varName, dbch->dbName, pvVarGetMess(dbch->pvid)); return status; } @@ -444,7 +446,7 @@ void seq_conn_handler(int connected, void *arg) unsigned dbCount; dbch->connected = TRUE; sp->connectCount++; - if (sp->firstMonitorCount == sp->monitorCount + if (sp->gotMonitorCount == sp->monitorCount && sp->connectCount == sp->assignCount) { epicsEventSignal(sp->ready);