Index: trunk/Ohana/src/opihi/pcontrol/CheckSystem.c
===================================================================
--- trunk/Ohana/src/opihi/pcontrol/CheckSystem.c	(revision 3187)
+++ trunk/Ohana/src/opihi/pcontrol/CheckSystem.c	(revision 3203)
@@ -4,72 +4,113 @@
 
   CheckBusyJobs();
+  CheckDoneJobs();
+  CheckDoneHosts();
+  CheckIdleHosts();
+  CheckDownHosts();
+
+  /** add in different timescales for heartbeat? **/
   CheckLiveHosts();
-  CheckDownHosts();
-  CheckIdleHosts();
-
 }
 
-CheckBusyJobs () {
+int CheckBusyJobs () {
 
-  queue = GetJobQueue (PCONTROL_JOB_BUSY);
-  Nobjects = queue[0].Nobjects;
+  int i, Nobject;
+  Stack *stack;
+  Job   *job;
 
-  for (i = 0; i < Nobjects; i++) {
-    job = GetObject (queue, QUEUE_TOP);
-    CheckJob (job);
+  stack = GetJobStack (PCONTROL_JOB_BUSY);
+  Nobject = stack[0].Nobject;
+
+  for (i = 0; i < Nobject; i++) {
+    job = GetStack (stack, STACK_TOP);
+    CheckBusyJob (job);
   }
 }
 
-CheckLiveHosts () {
+int CheckDoneJobs () {
 
-  queue = GetHostQueue (PCONTROL_HOST_IDLE);
-  Nobjects = queue[0].Nobjects;
+  int i, Nobject;
+  Stack *stack;
+  Job   *job;
 
-  for (i = 0; i < Nobjects; i++) {
-    host = GetObject (queue, QUEUE_TOP);
+  stack = GetJobStack (PCONTROL_JOB_DONE);
+  Nobject = stack[0].Nobject;
+
+  for (i = 0; i < Nobject; i++) {
+    job = GetStack (stack, STACK_TOP);
+    CheckDoneJob (job);
+  }
+}
+
+int CheckDoneHosts () {
+
+  int i, Nobject;
+  Stack *stack;
+  Host  *host;
+
+  stack = GetHostStack (PCONTROL_HOST_DONE);
+  Nobject = stack[0].Nobject;
+
+  for (i = 0; i < Nobject; i++) {
+    host = GetStack (stack, STACK_TOP);
+    StartHost (host);
+  }
+}
+
+/* this is just a heartbeat check */
+int CheckLiveHosts () {
+
+  int i, Nobject;
+  Stack *stack;
+  Host  *host;
+
+  stack = GetHostStack (PCONTROL_HOST_IDLE);
+  Nobject = stack[0].Nobject;
+
+  for (i = 0; i < Nobject; i++) {
+    host = GetStack (stack, STACK_TOP);
     CheckHost (host);
   }
 
-  queue = GetHostQueue (PCONTROL_HOST_BUSY);
-  Nobjects = queue[0].Nobjects;
+  stack = GetHostStack (PCONTROL_HOST_BUSY);
+  Nobject = stack[0].Nobject;
 
-  for (i = 0; i < Nobjects; i++) {
-    host = GetObject (queue, QUEUE_TOP);
+  for (i = 0; i < Nobject; i++) {
+    host = GetStack (stack, STACK_TOP);
     CheckHost (host);
   }
 }
 
-CheckDownHosts () {
+int CheckDownHosts () {
 
-  queue = GetHostQueue (PCONTROL_HOST_DOWN);
-  Nobjects = queue[0].Nobjects;
+  int i, Nobject;
+  Stack *stack;
+  Host  *host;
 
-  for (i = 0; i < Nobjects; i++) {
-    host = GetObject (queue, QUEUE_TOP);
+  stack = GetHostStack (PCONTROL_HOST_DOWN);
+  Nobject = stack[0].Nobject;
+
+  for (i = 0; i < Nobject; i++) {
+    host = GetStack (stack, STACK_TOP);
     StartHost (host);
   }
 }
 
-CheckIdleHosts () {
+int CheckIdleHosts () {
 
-  hqueue = HostPool_Idle;
-  jqueue = JobPool_Pending;
+  int i, Nobject;
+  Stack *stack;
+  Host  *host;
 
-  for (i = 0; i < hqueue[0].Nobjects; i++) {
-    host = (Host *) hqueue[0].object[i];
-    /** need to add a timeout here **/
-    for (j = 0; j < jqueue[0].Nobjects; j++) {
-      job = (Job *) jqueue[0].object[j];
-      if ((job[0].mode == PCONTROL_JOB_ANYHOST) ||
-	  (!strcasecmp (job[0].hostname, host[0].hostname))
+  /* check if there are any pending jobs, otherwise skip step */
+  stack = GetJobStack (PCONTROL_JOB_PENDING);
+  if (!stack[0].Nobject) return;
 
-    StartHost (host);
+  stack = GetHostStack (PCONTROL_HOST_IDLE);
+  Nobject = stack[0].Nobject;
+
+  for (i = 0; i < Nobject; i++) {
+    host = GetStack (stack, STACK_TOP);
+    CheckIdleHost (host);
   }
 }
-
-/*** this section is tricky: need to have a plan on making WANTHOST likely 
-     but not required  (on average, every host is currently in use.  some possible tricks:
-
-     - search through PENDING for N entries looking for WANTHOST / matching host
-     - keep job through N tries waiting for WANTHOST
-***/
