Mike Ayers wrote:
From: cygwin-xfree-ow...@cygwin.com [mailto:cygwin-xfree-
ow...@cygwin.com] On Behalf Of Lothar Brendel

Could you please clarify an issue here? (Sorry, it seems, I wronged
to ``run'' in the previous posts.)

In a Windows command prompt (being somewhere on C:) I put the line
        \cygwin\bin\run -p /usr/bin sleep -wait 5
into a file ``dosleep.bat''. Executing that BAT-script (w/o any
wrapper), it
*does* sleep. Typing that very line directly at the prompt lets
``run'' return immediately, though. Can you confirm this behaviour?

I can confirm that without testing (so I'm probably chomping foot
here...).  The sleep is holding the console open after run quits.

Sorry, I don't quite get it. *Which* console must it hold open? There is only the one I'm typing in and calling the BAT-script doesn't open another one. Hence, in how far does the environment of the BAT-script differ from the one of the command prompt?


Another possibility would be an option ``-n'' to specify the number
of retries.

GAH!  No, that's just lame.

All right, all right, you just convinced me. :-)


Just spawn/fork a
sleep-then-interrupt-daddy thread/process, set up a SIGINT handler
that exits with an error, loop connection attempts until successful,
check X, kill child, exit with success.  That enforces both types of
timeout.

Charles Wilson already set up this kind of infrastructure, I just had to introduce one more communication variable, cf. the patch below (positively tested on my system).

Yep, there are really two different purposes for a setting a timeout [i) "Just check whether an X server is available, but don't struggle with that too long." and ii) "There *should* be an X server coming up, just be a little patient."], but now both can be achieved by choosing either a short or a long duration.

Ciao
           Lothar


--- checkX.c-0.3.0 2009-06-15 02:29:07.000000000 +0200
+++ checkX.c 2009-11-14 19:36:31.000000000 +0100
@@ -32,6 +32,7 @@
#endif

#include <stdio.h>
+#include <errno.h>

#if HAVE_SYS_TYPES_H
# include <sys/types.h>
@@ -102,7 +103,8 @@

static pthread_mutex_t mtx_xopenOK;
static pthread_cond_t  cv_xopenOK;
-static int xopenOK = XSERV_TIMEDOUT;
+static int xopenOK;
+static int xopenTrying;
static const char* XLIBfmt = "cygX11-%d.dll";
static const char* DefaultAppendPath = "/usr/X11R6/bin" SEP_CHAR "/usr/bin";

@@ -314,6 +316,9 @@
  timespec_t     delta;
  timespec_t     then;

+  xopenTrying = delay!=0.0; /* false actually means: try once */
+  xopenOK = XSERV_NOTFOUND; /* a pessimistic start out */
+
  computeTimespec(fabs(delay), &delta);
debugMsg(1, "(%s) Using delay of %d secs, %ld nanosecs (%5.2f)", __func__,
           delta.tv_sec, delta.tv_nsec,
@@ -333,15 +338,14 @@
  if (delay != 0.0) {
    clock_gettime(CLOCK_REALTIME, &now);
    timerspec_add(&now, &delta, &then);
-    pthread_cond_timedwait (&cv_xopenOK, &mtx_xopenOK, &then);
-  }
-
-  pthread_mutex_unlock(&mtx_xopenOK);
-
-  if (delay != 0.0) {
-    pthread_detach(id);
+ if (pthread_cond_timedwait (&cv_xopenOK, &mtx_xopenOK, &then) == ETIMEDOUT) {
+      xopenOK = XSERV_TIMEDOUT; /* it's okay, we have the mutex */
+      xopenTrying = 0;  /* allow open_display() to give up */
+    }    /* else open_display() was successful */
+    pthread_detach(id);  /* leave open_display() on its own */
  } else {
-    pthread_join(id, (void*)&status);
+ pthread_mutex_unlock(&mtx_xopenOK); /* allow open_display() to set xopenOK */
+    pthread_join(id, (void*)&status); /* and wait for it */
  }

  pthread_mutex_destroy(&mtx_xopenOK);
@@ -357,19 +361,17 @@
open_display(void* /* WorkerThreadData* */ v)
{
  Display* dpy;
-  int rc = 0;
  WorkerThreadData* data = (WorkerThreadData*)v;

-  if( (dpy = (*(data->xopendis))(data->displayname)) == NULL ) {
-    rc = 1;
-  } else {
-    (*(data->xclosedis))(dpy);
-    rc = 0;
-  }
-  pthread_mutex_lock (&mtx_xopenOK);
-  xopenOK = rc;
-  pthread_cond_signal(&cv_xopenOK);
-  pthread_mutex_unlock (&mtx_xopenOK);
+  do
+    if((dpy = (*(data->xopendis))(data->displayname))) {
+      (*(data->xclosedis))(dpy);
+      pthread_mutex_lock (&mtx_xopenOK);
+      xopenOK = XSERV_FOUND;
+      pthread_cond_signal(&cv_xopenOK);
+      pthread_mutex_unlock (&mtx_xopenOK);
+    }
+  while (xopenTrying && xopenOK == XSERV_NOTFOUND);

  pthread_exit((void*)0);
}



--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://x.cygwin.com/docs/
FAQ:                   http://x.cygwin.com/docs/faq/

Reply via email to