Index: trunk/Ohana/src/opihi/pantasks/CheckController.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/CheckController.c	(revision 14590)
+++ trunk/Ohana/src/opihi/pantasks/CheckController.c	(revision 23530)
@@ -1,7 +1,6 @@
 # include "pantasks.h"
 
-static struct timeval start;
-void TimerMark ();
-float TimerElapsed (int reset);
+void TimerMark (struct timeval *start);
+float TimerElapsed (struct timeval *start, int reset);
 
 int CheckController () {
@@ -11,4 +10,5 @@
   Job *job;
   IOBuffer buffer;
+  struct timeval start;
 
   /* get the list of completed jobs (exit / crash), update the job status */
@@ -17,12 +17,10 @@
   /*** check EXIT jobs ***/
   InitIOBuffer (&buffer, 0x100);
-  // TimerMark ();
-  // status = ControllerCommand ("stop", CONTROLLER_PROMPT, &buffer); 
-  // if (VerboseMode()) gprint (GP_ERR, "stop controller %f\n", TimerElapsed(TRUE));
 
-  TimerMark ();
+  TimerMark (&start);
   FlushIOBuffer (&buffer);
+
   status = ControllerCommand ("jobstack exit", CONTROLLER_PROMPT, &buffer);
-  if (VerboseMode()) gprint (GP_ERR, "check exit stack %f\n", TimerElapsed(TRUE));
+  if (VerboseMode()) gprint (GP_ERR, "check exit stack %f\n", TimerElapsed(&start, TRUE));
   if (!status) goto escape;
 
@@ -34,5 +32,5 @@
   status = sscanf (buffer.buffer, "%*s %d", &Njobs);
   if (status != 1) goto escape;
-  if (VerboseMode()) gprint (GP_ERR, "parse %d jobs on stack %f\n", Njobs, TimerElapsed(TRUE));
+  if (VerboseMode()) gprint (GP_ERR, "parse %d jobs on stack %f\n", Njobs, TimerElapsed(&start, TRUE));
 
   p = buffer.buffer;
@@ -46,13 +44,18 @@
     status = sscanf (p, "%d", &JobID);
 
+    // the operations within this locked block only interact with the controller or
+    // modify the properties of the selected job
+    JobTaskLock();
     job = FindControllerJob (JobID);
     if (job == NULL) {
       gprint (GP_ERR, "misplaced job? %d not in EXIT job list\n", JobID);
+      JobTaskUnlock();
       continue;
     }
     /* this checks the individual job status, grabs stdout/stderr */
     CheckControllerJob (job);
+    JobTaskUnlock();
   }
-  if (VerboseMode()) gprint (GP_ERR, "clear %d exit jobs %f\n", i, TimerElapsed(TRUE));
+  if (VerboseMode()) gprint (GP_ERR, "clear %d exit jobs %f\n", i, TimerElapsed(&start, TRUE));
 
   /*** check CRASH jobs ***/
@@ -67,5 +70,5 @@
   status = sscanf (buffer.buffer, "%*s %d", &Njobs);
   if (status != 1) goto escape;
-  if (VerboseMode()) gprint (GP_ERR, "check crash stack %f\n", TimerElapsed(TRUE)); 
+  if (VerboseMode()) gprint (GP_ERR, "check crash stack %f\n", TimerElapsed(&start, TRUE)); 
 
   p = buffer.buffer;
@@ -77,18 +80,22 @@
     }
     p = q + 1;
-    
     status = sscanf (p, "%d", &JobID);
+
+    // the operations within this locked block only interact with the controller or
+    // modify the properties of the selected job
+    JobTaskLock();
     job = FindControllerJob (JobID);
     if (job == NULL) {
       gprint (GP_ERR, "misplaced job? %d not in CRASH job list\n", JobID);
+      JobTaskUnlock();
       continue;
     }
     /* this checks the individual job status, grabs stdout/stderr */
     CheckControllerJob (job);
+    JobTaskUnlock();
   }
-  if (VerboseMode()) gprint (GP_ERR, "clear %d crash jobs %f\n", i, TimerElapsed(TRUE)); 
+  if (VerboseMode()) gprint (GP_ERR, "clear %d crash jobs %f\n", i, TimerElapsed(&start, TRUE)); 
 
   FlushIOBuffer (&buffer);
-  // status = ControllerCommand ("run", CONTROLLER_PROMPT, &buffer);
   FreeIOBuffer (&buffer);
   return (TRUE);
@@ -96,14 +103,13 @@
  escape:
   FlushIOBuffer (&buffer);
-  // status = ControllerCommand ("run", CONTROLLER_PROMPT, &buffer); 
   FreeIOBuffer (&buffer);
   return (FALSE);
 }
 
-void TimerMark () {
-    gettimeofday (&start, (void *) NULL);
+void TimerMark (struct timeval *start) {
+    gettimeofday (start, (void *) NULL);
 }
 
-float TimerElapsed (int reset) {
+float TimerElapsed (struct timeval *start, int reset) {
 
   float dtime;
@@ -111,6 +117,6 @@
 
   gettimeofday (&stop, (void *) NULL);
-  dtime = DTIME (stop, start);
-  if (reset) gettimeofday (&start, (void *) NULL);
+  dtime = DTIME (stop, start[0]);
+  if (reset) gettimeofday (start, (void *) NULL);
   return (dtime);
 }
