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/