Index: trunk/Ohana/src/opihi/pantasks/CheckJobs.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/CheckJobs.c	(revision 9278)
+++ trunk/Ohana/src/opihi/pantasks/CheckJobs.c	(revision 11055)
@@ -5,4 +5,5 @@
   FILE *f;
   Job *job;
+  Task *task;
   Macro *macro;
   int i, status;
@@ -13,6 +14,8 @@
   while ((job = NextJob ()) != NULL) {
 
+    task = job[0].task;
+
     /* check poll period (ready to ask for status?) */
-    if (GetTaskTimer(job[0].last) < job[0].task[0].poll_period) continue;
+    if (GetTaskTimer(job[0].last) < task[0].poll_period) continue;
 
     /* check current status */
@@ -20,9 +23,9 @@
     switch (status) {
       case JOB_PENDING:
-	/* if (VerboseMode()) gprint (GP_LOG, "job %s (%d) pending\n", job[0].task[0].name, job[0].JobID); */
+	/* if (VerboseMode()) gprint (GP_LOG, "job %s (%d) pending\n", task[0].name, job[0].JobID); */
 	break;
 
       case JOB_BUSY:
-	/* if (VerboseMode()) gprint (GP_LOG, "job %s (%d) busy\n", job[0].task[0].name, job[0].JobID); */
+	/* if (VerboseMode()) gprint (GP_LOG, "job %s (%d) busy\n", task[0].name, job[0].JobID); */
 	break;
 
@@ -35,5 +38,5 @@
 
 	/* save the stdout and stderr if desired */
-	if (job[0].stdout_dump != NULL) {
+	if ((job[0].stdout_dump != NULL) && strcasecmp(job[0].stdout_dump, "NULL")) {
 	  f = fopen (job[0].stdout_dump, "a");
 	  if (f == NULL) {
@@ -44,5 +47,5 @@
 	  }
 	}
-	if (job[0].stderr_dump != NULL) {
+	if ((job[0].stderr_dump != NULL) && strcasecmp(job[0].stderr_dump, "NULL")) {
 	  f = fopen (job[0].stderr_dump, "a");
 	  if (f == NULL) {
@@ -68,14 +71,19 @@
 	set_int_variable ("options:n", job[0].optc);
 
+	set_variable ("JOB_DTIME", job[0].dtime);
+
 	if (status == JOB_CRASH) {
 	  /* XXX add an Ncrash element? */
-	  job[0].task[0].Nfailure ++;
+	  task[0].Nfailure ++;
+	  UpdateTaskTimerStats (task, TIMER_FAILURE, job[0].dtime);
 
 	  /* run task[0].crash macro, if it exists */
 	  /* perhaps define PushNamedQueueBuffer */
 
-	  if (VerboseMode()) gprint (GP_LOG, "job %s (%d) crash\n", job[0].task[0].name, job[0].JobID);
-	  if (job[0].task[0].crash != NULL) {
-	    exec_loop (job[0].task[0].crash);
+	  set_str_variable ("JOB_STATUS", "CRASH");
+
+	  if (VerboseMode()) gprint (GP_LOG, "job %s (%d) crash\n", task[0].name, job[0].JobID);
+	  if (task[0].crash != NULL) {
+	    exec_loop (task[0].crash);
 	  }
 	}
@@ -83,15 +91,19 @@
 	  /* update the exit status counters */
 	  if (job[0].exit_status) {
-	    job[0].task[0].Nfailure ++;
+	    task[0].Nfailure ++;
+	    UpdateTaskTimerStats (task, TIMER_FAILURE, job[0].dtime);
 	  } else {
-	    job[0].task[0].Nsuccess ++;
-	  }
+	    task[0].Nsuccess ++;
+	    UpdateTaskTimerStats (task, TIMER_SUCCESS, job[0].dtime);
+	  }
+
+	  set_int_variable ("JOB_STATUS", job[0].exit_status);
 
 	  /* run corresponding task[0].exit macro, if it exists */
-	  if (VerboseMode()) gprint (GP_LOG, "job %s (%d) exit\n", job[0].task[0].name, job[0].JobID);
-	  macro = job[0].task[0].defexit;
-	  for (i = 0; i < job[0].task[0].Nexit; i++) {
-	    if (job[0].exit_status == atoi(job[0].task[0].exit[i][0].name)) {
-	      macro = job[0].task[0].exit[i];
+	  if (VerboseMode()) gprint (GP_LOG, "job %s (%d) exit\n", task[0].name, job[0].JobID);
+	  macro = task[0].defexit;
+	  for (i = 0; i < task[0].Nexit; i++) {
+	    if (job[0].exit_status == atoi(task[0].exit[i][0].name)) {
+	      macro = task[0].exit[i];
 	      break;
 	    }
@@ -106,4 +118,7 @@
 	if (queue) InitQueue (queue);
 
+	UpdateTaskTimerStats (task, TIMER_ALLJOBS, job[0].dtime);
+
+	task[0].Npending --;
 	DeleteJob (job);
 	continue;
@@ -120,6 +135,6 @@
      */
     if (job[0].mode == JOB_LOCAL) {
-      if (GetTaskTimer(job[0].start) < job[0].task[0].timeout_period) continue;
-      if (VerboseMode()) gprint (GP_LOG, "timeout on %s\n", job[0].task[0].name);
+      if (GetTaskTimer(job[0].start) < task[0].timeout_period) continue;
+      if (VerboseMode()) gprint (GP_LOG, "timeout on %s\n", task[0].name);
 
       // XXX harvest STDERR and STDOUT from timeout job (should be available...)
@@ -127,5 +142,5 @@
 
       /* update the timeout counter */
-      job[0].task[0].Ntimeout ++;
+      task[0].Ntimeout ++;
 
       if (!KillLocalJob (job)) {
@@ -150,6 +165,6 @@
 
       /* run task[0].timeout macro, if it exists */
-      if (job[0].task[0].timeout != NULL) {
-	exec_loop (job[0].task[0].timeout);
+      if (task[0].timeout != NULL) {
+	exec_loop (task[0].timeout);
       }
       DeleteJob (job);
