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