Index: trunk/Ohana/src/opihi/pcontrol/JobOps.c
===================================================================
--- trunk/Ohana/src/opihi/pcontrol/JobOps.c	(revision 3189)
+++ trunk/Ohana/src/opihi/pcontrol/JobOps.c	(revision 3203)
@@ -1,11 +1,18 @@
 # include "pcontrol.h"
 
-Queue *JobPool_Pending;
-Queue *JobPool_Busy;
-Queue *JobPool_Exit;
-Queue *JobPool_Crash;
+Stack *JobPool_Pending;
+Stack *JobPool_Busy;
+Stack *JobPool_Exit;
+Stack *JobPool_Crash;
 
-Queue *GetJobQueue (int QueueID) {
-  switch (QueueID) {
+void InitJobStacks () {
+  JobPool_Pending = InitStack ();
+  JobPool_Busy = InitStack ();
+  JobPool_Exit = InitStack ();
+  JobPool_Crash = InitStack ();
+}
+
+Stack *GetJobStack (int StackID) {
+  switch (StackID) {
     case PCONTROL_JOB_PENDING:
       return (JobPool_Pending);
@@ -14,8 +21,8 @@
     case PCONTROL_JOB_EXIT:
       return (JobPool_Exit);
-    case PCONTROL_JOB_Crash:
+    case PCONTROL_JOB_CRASH:
       return (JobPool_Crash);
     default:
-      fprintf (stderr, "error: unknown job queue\n");
+      fprintf (stderr, "error: unknown job stack\n");
       return (NULL);
   }
@@ -23,39 +30,42 @@
 }
 
-int PutJob (Job *job, int QueueID, int where) {
+int PutJob (Job *job, int StackID, int where) {
 
   int status;
-  Queue *queue;
+  Stack *stack;
 
-  queue = GetJobQueue (QueueID);
-  if (queue == NULL) return (FALSE);
+  stack = GetJobStack (StackID);
+  if (stack == NULL) return (FALSE);
 
-  job[0].status = QueueID;
-  status = PutObject (queue, where, job);
+  /* be default, these are both the same - to override, set state after PutJob */
+  job[0].state = StackID;
+  job[0].stack = StackID;
+  status = PutStack (stack, where, job);
   return (status);
 }
   
-Job *GetJob (int QueueID, int where) {
+Job *GetJob (int StackID, int where) {
 
   Job *job;
-  Queue *queue;
+  Stack *stack;
 
-  queue = GetJobQueue (QueueID);
-  if (queue == NULL) return (NULL);
+  stack = GetJobStack (StackID);
+  if (stack == NULL) return (NULL);
 
-  job = GetObject (queue, where);
+  job = GetStack (stack, where);
   return (job);
 }
   
-int FindJob (IDtype JobID, int QueueID) {
+int FindJob (IDtype JobID, int StackID) {
 
+  int i;
   Job *job;
-  Queue *queue;
+  Stack *stack;
 
-  queue = GetJobQueue (QueueID);
-  if (queue == NULL) return (-2);
+  stack = GetJobStack (StackID);
+  if (stack == NULL) return (-2);
 
-  for (i = 0; i < queue[0].Nobject; i++) {
-    job = (Job *) queue[0].object;
+  for (i = 0; i < stack[0].Nobject; i++) {
+    job = (Job *) stack[0].object;
     if (job[0].JobID == JobID) {
       return (i);
@@ -65,5 +75,5 @@
 }
 
-AddJob (char *hostname, JobMode mode, int timeout, int argc, char **argv) {
+IDtype AddJob (char *hostname, JobMode mode, int timeout, int argc, char **argv) {
 
   Job *job;
@@ -76,14 +86,18 @@
   job[0].mode     = mode;
   job[0].host     = NULL;
-  job[0].ID       = NextJobID();
+  job[0].JobID    = NextJobID();
+  job[0].Reset    = FALSE;
 
-  InitIOBuffer (&job[0].stdin,  0x1000);
+  /* do this step on start? */
   InitIOBuffer (&job[0].stdout, 0x1000);
   InitIOBuffer (&job[0].stderr, 0x1000);
 
-  PutJob (job, PCONTROL_JOB_PENDING, QUEUE_BOTTOM);
+  PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
+  return (job[0].JobID);
 }
 
-DelJob (Job *job) {
+void DelJob (Job *job) {
+
+  int i;
 
   FREE (job[0].hostname);
@@ -93,5 +107,4 @@
   FREE (job[0].argv);
 
-  FreeIOBuffer (&job[0].stdin);
   FreeIOBuffer (&job[0].stdout);
   FreeIOBuffer (&job[0].stderr);
@@ -100,7 +113,10 @@
 }
 
-KillJob (Job *job) {
+# if (0)
+void KillJob (Job *job) {
 
+  int status;
   char line[64];
+  Host *host;
 
   sprintf (line, "reset\n");
@@ -110,9 +126,37 @@
   if ((status == -1) && (errno == EPIPE)) {
     fprintf (stderr, "host %s is down\n", host[0].hostname);
-    PutHost (host, PCONTROL_HOST_DOWN, QUEUE_BOTTOM);
-    PutJob (job, PCONTROL_JOB_PENDING, QUEUE_BOTTOM);
+    PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
+    PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
     return (FALSE);
   }
   /* check for a response */
 
+  /** this needs to be cleaned up to handle the slow response case **/
 }
+# endif
+
+Host *UnlinkJobAndHost (Job *job) {
+
+  int N;
+  Host *host;
+
+  host = job[0].host;
+
+  /* unlink host & job */
+  job[0].host = NULL;
+  host[0].job = NULL;
+  
+  /*** need to pop host off of correct stack XXX ***/
+  N = FindHost (host[0].HostID, host[0].stack);
+  if (N < 0) {
+    fprintf (stderr, "programming error: host is not found in current stack\n");
+    exit (2);
+  }
+  host = GetHost (host[0].stack, N);
+  return (host);
+}
+
+void LinkJobAndHost (Job *job, Host *host) {
+  job[0].host = host;
+  host[0].job = job;
+}
