From a4a18b2bc5b29ee84a9ba51152858bcb59bb4591 Mon Sep 17 00:00:00 2001 From: "benjamin.franksen" <benjamin.franksen@helmholtz-berlin.de> Date: Tue, 24 Sep 2013 18:18:04 +0000 Subject: [PATCH] seq: add pvSys to globals, add createOrAttachPvSystem, remove pvSys code from addProg --- src/seq/seqPvt.h | 1 + src/seq/seq_cmd.c | 17 +++++++++++++++++ src/seq/seq_prog.c | 22 +++------------------- src/seq/seq_task.c | 7 ++++--- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/seq/seqPvt.h b/src/seq/seqPvt.h index bd0dc030..78cc8655 100644 --- a/src/seq/seqPvt.h +++ b/src/seq/seqPvt.h @@ -247,6 +247,7 @@ void seqAddProg(SPROG *sp); /* seqCommands.c */ typedef int sequencerProgramTraversee(SPROG **sprog, seqProgram *pseq, void *param); int traverseSequencerPrograms(sequencerProgramTraversee *traversee, void *param); +void createOrAttachPvSystem(SPROG *sp); /* seq_main.c */ void seq_free(SPROG *sp); diff --git a/src/seq/seq_cmd.c b/src/seq/seq_cmd.c index 91c7ad70..9a9f6416 100644 --- a/src/seq/seq_cmd.c +++ b/src/seq/seq_cmd.c @@ -30,6 +30,7 @@ static struct { epicsMutexId lock; struct sequencerProgram *programs; + pvSystem pvSys; } globals; static void seqInitPvt(void *arg) @@ -47,6 +48,22 @@ static void seqLazyInit() epicsThreadOnce(&seqOnceFlag, seqInitPvt, NULL); } +void createOrAttachPvSystem(struct program_instance *sp) +{ + seqLazyInit(); + epicsMutexMustLock(globals.lock); + if (!pvSysIsDefined(globals.pvSys)) { + pvStat status = pvSysCreate(&globals.pvSys); + if (status != pvStatOK) { + errlogPrintf("getPvSystem: pvSysCreate() failure\n"); + } + } else { + pvSysAttach(globals.pvSys); + } + sp->pvSys = globals.pvSys; + epicsMutexUnlock(globals.lock); +} + epicsShareFunc void seqRegisterSequencerProgram(seqProgram *prog) { struct sequencerProgram *sp = NULL; diff --git a/src/seq/seq_prog.c b/src/seq/seq_prog.c index 4ab9f703..acf98f96 100644 --- a/src/seq/seq_prog.c +++ b/src/seq/seq_prog.c @@ -46,7 +46,7 @@ static int findStateSet(SPROG *sp, void *param) } /* - * seqFindStateSet() - find a state set in the state program list from thread id. + * seqFindStateSet() - find a state set in the program list from thread id. */ SSCB *seqFindStateSet(epicsThreadId threadId) { @@ -93,23 +93,8 @@ static int addProg(SPROG **ppInstances, seqProgram *pseq, void *param) SPROG *sp = (SPROG *)param; if (!ppInstances || !pseq) { - if (!pvSysIsDefined(sp->pvSys)) { - pvStat status = pvSysCreate(&sp->pvSys); - if (status != pvStatOK) { - errlogPrintf("pvSysCreate() failure\n"); - } - } return FALSE; } - if (!pvSysIsDefined(sp->pvSys)) { - SPROG *curSP; - foreach(curSP, *ppInstances) { - if (pvSysIsDefined(curSP->pvSys)) { - sp->pvSys = curSP->pvSys; - } - break; - } - } /* same program name */ if (strcmp(sp->progName, pseq->progName) == 0) { SPROG *curSP, *lastSP = NULL; @@ -130,10 +115,9 @@ static int addProg(SPROG **ppInstances, seqProgram *pseq, void *param) } DEBUG("Added program %p, instance %d to instance list.\n", sp, sp->instance); - if (pvSysIsDefined(sp->pvSys)) - return TRUE; + return TRUE; /* terminate traversal */ } - return FALSE; + return FALSE; /* continue traversal */ } /* diff --git a/src/seq/seq_task.c b/src/seq/seq_task.c index d6a2c8b3..6ec5f952 100644 --- a/src/seq/seq_task.c +++ b/src/seq/seq_task.c @@ -28,10 +28,11 @@ void sequencer (void *arg) /* ptr to original (global) state program table */ /* Get this thread's id */ sp->ss->threadId = epicsThreadGetIdSelf(); - /* Add the program to the state program list - and if necessary create pvSys */ + /* Add the program to the program list */ seqAddProg(sp); + createOrAttachPvSystem(sp); + if (!pvSysIsDefined(sp->pvSys)) { sp->die = TRUE; @@ -262,7 +263,7 @@ static void ss_entry(void *arg) if (ss != sp->ss) { ss->threadId = epicsThreadGetIdSelf(); - pvSysAttach(sp->pvSys); + createOrAttachPvSystem(sp); } /* Register this thread with the EPICS watchdog (no callback func) */ -- GitLab