diff --git a/src/seq/seqCom.h b/src/seq/seqCom.h index 577f7f7563ac4a9cce9919164718abfbfc5e30be..f4ba80ee6301fe8a6094f21c0d8c8b2e2395e468 100644 --- a/src/seq/seqCom.h +++ b/src/seq/seqCom.h @@ -55,7 +55,7 @@ typedef struct _seq_vars SEQ_VARS; /* struct defined in generated code */ typedef char string[MAX_STRING_SIZE]; /* representation of SNL string type */ /* these typedefs make the code more self documenting */ -typedef unsigned EV_ID; /* identifier for an event */ +typedef unsigned EF_ID; /* identifier for an event */ typedef unsigned CH_ID; /* identifier for a pv */ typedef int seqBool; @@ -68,10 +68,10 @@ typedef struct seqProgram seqProgram; /* struct defined in generated code */ */ /* event flag operations */ -epicsShareFunc void seq_efSet(SS_ID, EV_ID); -epicsShareFunc seqBool seq_efTest(SS_ID, EV_ID); -epicsShareFunc seqBool seq_efClear(SS_ID, EV_ID); -epicsShareFunc seqBool seq_efTestAndClear(SS_ID, EV_ID); +epicsShareFunc void seq_efSet(SS_ID, EF_ID); +epicsShareFunc seqBool seq_efTest(SS_ID, EF_ID); +epicsShareFunc seqBool seq_efClear(SS_ID, EF_ID); +epicsShareFunc seqBool seq_efTestAndClear(SS_ID, EF_ID); /* pv operations */ epicsShareFunc pvStat seq_pvGet(SS_ID, CH_ID, enum compType, double tmo); epicsShareFunc pvStat seq_pvGetMultiple(SS_ID, CH_ID, @@ -89,7 +89,7 @@ epicsShareFunc void seq_pvGetCancel(SS_ID, CH_ID, unsigned); epicsShareFunc void seq_pvPutCancel(SS_ID, CH_ID, unsigned); epicsShareFunc pvStat seq_pvAssign(SS_ID, CH_ID, const char *); epicsShareFunc pvStat seq_pvMonitor(SS_ID, CH_ID, unsigned); -epicsShareFunc void seq_pvSync(SS_ID, CH_ID, unsigned, EV_ID); +epicsShareFunc void seq_pvSync(SS_ID, CH_ID, unsigned, EF_ID); epicsShareFunc pvStat seq_pvStopMonitor(SS_ID, CH_ID, unsigned); /* pv info */ epicsShareFunc char *seq_pvName(SS_ID, CH_ID); @@ -132,6 +132,7 @@ epicsShareFunc epicsThreadId seq(seqProgram *, const char *, unsigned); #define USER_VAR SEQ_VARS #define UserVar _seq_vars #define VAR_ID CH_ID +#define EV_ID EF_ID #define seq_pvFreeQ seq_pvFlushQ #define DEFAULT_QUEUE_SIZE 100 /* number of elements */ diff --git a/src/seq/seqPvt.h b/src/seq/seqPvt.h index 2848bf602480a707718e54f154d326e357036c52..9bcf04aff87a8da3fadc2f917844e0f10f9ea8be 100644 --- a/src/seq/seqPvt.h +++ b/src/seq/seqPvt.h @@ -94,7 +94,7 @@ struct channel /* dynamic channel data (assigned at runtime) */ DBCHAN *dbch; /* channel assigned to a named db pv */ - EV_ID syncedTo; /* event flag id if synced */ + EF_ID syncedTo; /* event flag id if synced */ CHAN *nextSynced; /* next channel synced to same flag */ QUEUE queue; /* queue if queued */ boolean monitored; /* whether channel is monitored */ @@ -218,7 +218,7 @@ struct pvreq void sequencer(void *arg); void ss_write_buffer(CHAN *ch, void *val, PVMETA *meta, boolean dirtify); void ss_read_buffer(SSCB *ss, CHAN *ch, boolean dirty_only); -void ss_read_buffer_selective(PROG *sp, SSCB *ss, EV_ID ev_flag); +void ss_read_buffer_selective(PROG *sp, SSCB *ss, EF_ID ev_flag); void ss_wakeup(PROG *sp, unsigned eventNum); /* seq_mac.c */ diff --git a/src/seq/seq_if.c b/src/seq/seq_if.c index 69a60de5f6aa2c21278505fb7c4690f90b507b04..2f63201bfdd45b03b8426cfede72bdd67e8aac66 100644 --- a/src/seq/seq_if.c +++ b/src/seq/seq_if.c @@ -769,7 +769,7 @@ epicsShareFunc pvStat seq_pvStopMonitor(SS_ID ss, CH_ID chId, unsigned length) * Synchronize pv with an event flag. * ev_flag == 0 means unSync. */ -epicsShareFunc void seq_pvSync(SS_ID ss, CH_ID chId, unsigned length, EV_ID new_ev_flag) +epicsShareFunc void seq_pvSync(SS_ID ss, CH_ID chId, unsigned length, EF_ID new_ev_flag) { PROG *sp = ss->prog; unsigned i; @@ -780,7 +780,7 @@ epicsShareFunc void seq_pvSync(SS_ID ss, CH_ID chId, unsigned length, EV_ID new_ for (i=0; i<length; i++) { CHAN *this_ch = sp->chan + chId + i; - EV_ID old_ev_flag = this_ch->syncedTo; + EF_ID old_ev_flag = this_ch->syncedTo; if (old_ev_flag != new_ev_flag) { @@ -937,13 +937,12 @@ epicsShareFunc epicsTimeStamp seq_pvTimeStamp(SS_ID ss, CH_ID chId) * Set an event flag, then wake up each state * set that might be waiting on that event flag. */ -epicsShareFunc void seq_efSet(SS_ID ss, EV_ID ev_flag) +epicsShareFunc void seq_efSet(SS_ID ss, EF_ID ev_flag) { PROG *sp = ss->prog; - DEBUG("efSet: sp=%p, ss=%p, ev_flag=%d\n", sp, ss, - ev_flag); - assert(ev_flag > 0 && ev_flag <= ss->prog->numEvFlags); + DEBUG("efSet: sp=%p, ev_flag=%d\n", sp, ev_flag); + assert(ev_flag > 0 && ev_flag <= sp->numEvFlags); epicsMutexMustLock(sp->lock); @@ -956,10 +955,25 @@ epicsShareFunc void seq_efSet(SS_ID ss, EV_ID ev_flag) epicsMutexUnlock(sp->lock); } +/* + * Initialize an event flag. + */ +epicsShareFunc void seq_efInit(PROG_ID sp, EF_ID ev_flag, unsigned val) +{ + assert(ev_flag > 0 && ev_flag <= sp->numEvFlags); + + epicsMutexMustLock(sp->lock); + if (val) + bitSet(sp->evFlags, ev_flag); + else + bitClear(sp->evFlags, ev_flag); + epicsMutexUnlock(sp->lock); +} + /* * Return whether event flag is set. */ -epicsShareFunc boolean seq_efTest(SS_ID ss, EV_ID ev_flag) +epicsShareFunc boolean seq_efTest(SS_ID ss, EF_ID ev_flag) /* event flag */ { PROG *sp = ss->prog; @@ -983,7 +997,7 @@ epicsShareFunc boolean seq_efTest(SS_ID ss, EV_ID ev_flag) /* * Clear event flag. */ -epicsShareFunc boolean seq_efClear(SS_ID ss, EV_ID ev_flag) +epicsShareFunc boolean seq_efClear(SS_ID ss, EF_ID ev_flag) { PROG *sp = ss->prog; boolean isSet; @@ -1006,7 +1020,7 @@ epicsShareFunc boolean seq_efClear(SS_ID ss, EV_ID ev_flag) * Atomically test event flag against outstanding events, then clear it * and return whether it was set. */ -epicsShareFunc boolean seq_efTestAndClear(SS_ID ss, EV_ID ev_flag) +epicsShareFunc boolean seq_efTestAndClear(SS_ID ss, EF_ID ev_flag) { PROG *sp = ss->prog; boolean isSet; @@ -1063,7 +1077,7 @@ epicsShareFunc boolean seq_pvGetQ(SS_ID ss, CH_ID chId) PROG *sp = ss->prog; CHAN *ch = sp->chan + chId; void *var = valPtr(ch,ss); - EV_ID ev_flag = ch->syncedTo; + EF_ID ev_flag = ch->syncedTo; PVMETA *meta = metaPtr(ch,ss); boolean was_empty; struct getq_cp_arg arg = {ch, var, meta}; @@ -1100,7 +1114,7 @@ epicsShareFunc void seq_pvFlushQ(SS_ID ss, CH_ID chId) { PROG *sp = ss->prog; CHAN *ch = sp->chan + chId; - EV_ID ev_flag = ch->syncedTo; + EF_ID ev_flag = ch->syncedTo; QUEUE queue = ch->queue; DEBUG("pvFlushQ: pv name=%s, count=%d\n", diff --git a/src/seq/seq_snc.h b/src/seq/seq_snc.h index 0e6987c72c2cee818a5952564b1aa479930896bc..5d59c7e8ac03e5599ea559c242e48fd1ea532466 100644 --- a/src/seq/seq_snc.h +++ b/src/seq/seq_snc.h @@ -85,7 +85,7 @@ struct seqChan enum prim_type_tag varType; /* variable (base) type */ unsigned count; /* element count for arrays */ unsigned eventNum; /* event number for this channel */ - EV_ID efId; /* event flag id if synced */ + EF_ID efId; /* event flag id if synced */ seqBool monitored; /* whether channel should be monitored */ unsigned queueSize; /* syncQ queue size (0=not queued) */ unsigned queueIndex; /* syncQ queue index */ @@ -130,6 +130,8 @@ struct seqProgram unsigned numQueues; /* number of syncQ queues */ }; +epicsShareFunc void seq_efInit(PROG_ID sp, EF_ID ev_flag, unsigned val); + /* called by generated main and registrar routines */ epicsShareFunc void seqRegisterSequencerProgram(seqProgram *p); epicsShareFunc void seqRegisterSequencerCommands(void); diff --git a/src/seq/seq_task.c b/src/seq/seq_task.c index f63e71b213971b52d7bc33159417b1a1dcccd671..7b6e3b995ca21e7f56523340e8fc2391ba2957fe 100644 --- a/src/seq/seq_task.c +++ b/src/seq/seq_task.c @@ -197,7 +197,7 @@ static void ss_read_all_buffer(PROG *sp, SSCB *ss) * NOTE: calling code must take sp->lock, as we traverse * the list of channels synced to this event flag. */ -void ss_read_buffer_selective(PROG *sp, SSCB *ss, EV_ID ev_flag) +void ss_read_buffer_selective(PROG *sp, SSCB *ss, EF_ID ev_flag) { CHAN *ch = sp->syncedChans[ev_flag]; while (ch)