Index: trunk/Ohana/src/opihi/pcontrol/CheckBusyJob.c
===================================================================
--- trunk/Ohana/src/opihi/pcontrol/CheckBusyJob.c	(revision 8296)
+++ trunk/Ohana/src/opihi/pcontrol/CheckBusyJob.c	(revision 8424)
@@ -1,5 +1,5 @@
 # include "pcontrol.h"
 
-int CheckBusyJob (Job *job) {
+int CheckBusyJob (Job *job, Host *host) {
 
   int      status;
@@ -8,5 +8,4 @@
   char     string[64];
   IOBuffer buffer;
-  Host    *host;
 
   /* we are checking a job which is currently busy.  it has been pulled from the
@@ -14,6 +13,6 @@
      XXX need to check on state of HOST on return */
 
-  /** must have a valid host : if not? **/
-  host = (Host *) job[0].host;
+  ASSERT (host == (Host *) job[0].host, "invalid host");
+  ASSERT (job  == (Job *) host[0].job, "invalid job");
 
   InitIOBuffer (&buffer, 0x100);
@@ -25,5 +24,7 @@
     case PCLIENT_DOWN:
       HarvestHost (host[0].pid);
-      UnlinkJobAndHost (job);
+      // unlink host & job
+      job[0].host = NULL;
+      host[0].job = NULL;
       PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
       PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
@@ -32,4 +33,9 @@
 
     case PCLIENT_HUNG:
+      HarvestHost (host[0].pid);
+      // unlink host & job
+      job[0].host = NULL;
+      host[0].job = NULL;
+      PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
       PutJobSetState (job, PCONTROL_JOB_BUSY, STACK_BOTTOM, PCONTROL_JOB_HUNG);
       FreeIOBuffer (&buffer);
@@ -37,25 +43,21 @@
 
     case PCLIENT_GOOD:
-      if (VerboseMode()) gprint (GP_ERR, "message received (CheckBusyJob)\n");
+      if (VerboseMode()) gprint (GP_ERR, "message received (CheckBusyJob)");
       break;
 
     default:
-      gprint (GP_ERR, "programming error: unknown status for pclient command\n");  
-      exit (1);
+      ABORT ("unknown status for pclient command");  
   }
 
   /** host is up, need to parse message **/
   p = memstr (buffer.buffer, "STATUS", buffer.Nbuffer);
-  if (p == NULL) {
-    gprint (GP_ERR, "programming error: missing STATUS in pclient message\n");
-    exit (1);
-  }
+  ASSERT (p != NULL, "missing STATUS in pclient message");
+
   sscanf (p, "%*s %s", string);
-  if (!strcmp(string, "NONE")) {
-    gprint (GP_ERR, "programming error: no current job\n");
-    exit (1);
-  }
+  ASSERT (strcmp(string, "NONE"), "no current job\n");
+
   /** no status change, return to BUSY stack **/
   if (!strcmp(string, "BUSY")) {
+    PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
     PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
     FreeIOBuffer (&buffer);
@@ -67,8 +69,5 @@
   if (!strcmp(string, "EXIT")) outstate = PCONTROL_JOB_EXIT;
   if (!strcmp(string, "CRASH")) outstate = PCONTROL_JOB_CRASH;
-  if (outstate == PCONTROL_JOB_BUSY) {
-    gprint (GP_ERR, "programming error : should not reach here (CheckJob)\n");
-    exit (1);
-  }
+  ASSERT (outstate != PCONTROL_JOB_BUSY, "should not reach here (CheckJob)");
 
   /* parse the exit status and sizes of output buffers */
@@ -80,9 +79,10 @@
   sscanf (p, "%*s %d", &job[0].stderr_size);
 
-  /** job has exited : move to DONE stack (host still BUSY) **/
+  // job has exited : move to DONE stack 
+  // the host is still BUSY until job output is gathered (int CheckDoneJob)
+  // don't unlink job and host yet
+  PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
   PutJobSetState (job, PCONTROL_JOB_DONE, STACK_BOTTOM, outstate);
   FreeIOBuffer (&buffer);
   return (TRUE);
 }
-
-/** need to add timeout check here **/
