Index: trunk/Ohana/src/opihi/pantasks/ControllerOps.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/ControllerOps.c	(revision 4714)
+++ trunk/Ohana/src/opihi/pantasks/ControllerOps.c	(revision 4762)
@@ -1,5 +1,5 @@
 # include "psched.h"
 /* adding a new host can delay controller up to a second or so */
-# define CONTROLLER_TIMEOUT 200
+# define CONTROLLER_TIMEOUT 500
 # define CONNECT_TIMEOUT 300
 
@@ -18,9 +18,20 @@
 /* check job / get output if done */
 int CheckControllerJob (Job *job) {
-
+  struct timeval start, stop;
+  float dtime;
+
+  gettimeofday (&start, (void *) NULL);
   CheckControllerJobStatus (job);
+  gettimeofday (&stop, (void *) NULL);
+  dtime = DTIME (stop, start);
+  if (VerboseMode()) fprintf (stderr, "check job status %f\n", dtime);
 
   if ((job[0].state == JOB_EXIT) || (job[0].state == JOB_CRASH)) {
+    gettimeofday (&start, (void *) NULL);
     GetJobOutput ("stdout", job[0].pid, &job[0].stdout, job[0].stdout_size);
+    gettimeofday (&stop, (void *) NULL);
+    dtime = DTIME (stop, start);
+    if (VerboseMode()) fprintf (stderr, "get stdout %f\n", dtime);
+
     GetJobOutput ("stderr", job[0].pid, &job[0].stderr, job[0].stderr_size);
     DeleteControllerJob (job);
@@ -97,4 +108,9 @@
   int i, status, Nstart;
   char *line;
+  struct timespec request, remain;
+
+  /* avoid blocking on waitpid, test every 100 usec, up to 50 msec */
+  request.tv_sec = 0;
+  request.tv_nsec = 100000;
 
   /* flush any earlier messages */
@@ -117,5 +133,5 @@
       line = memstr (buffer[0].buffer, CONTROLLER_PROMPT, buffer[0].Nbuffer);
     }
-    if (status == -1) usleep (10000);
+    if (status == -1) nanosleep (&request, &remain);
   }
   if (status ==  0) return (CONTROLLER_DOWN);
@@ -256,4 +272,5 @@
 
   /* try to get evidence connection is alive - wait upto a few seconds */
+  /* connection is likely slow; don't bother with nanosleep here */
   p = NULL;
   status = -1;
@@ -300,7 +317,11 @@
 int ControllerCommand (char *cmd, char *response, IOBuffer *buffer) {
 
-  int i;
-  int status;
+  int i, status;
   char *line;
+  struct timespec request, remain;
+
+  /* avoid blocking on waitpid, test every 100 usec, up to 50 msec */
+  request.tv_sec = 0;
+  request.tv_nsec = 100000;
 
   ReadtoIOBuffer (buffer, stdout_cntl);
@@ -323,5 +344,5 @@
     status = ReadtoIOBuffer (buffer, stdout_cntl);
     line = memstr (buffer[0].buffer, response, buffer[0].Nbuffer);
-    if (status == -1) usleep (10000);
+    if (status == -1) nanosleep (&request, &remain);
   }
   if (status ==  0) {
@@ -341,5 +362,5 @@
     bzero (buffer[0].buffer + buffer[0].Nbuffer, buffer[0].Nalloc - buffer[0].Nbuffer);
   }
-  if (VerboseMode()) fprintf (stderr, "message received\n");
+  if (VerboseMode()) fprintf (stderr, "message received, %d cycles\n", i);
   return (TRUE);
 }
