Article View: comp.windows.x
Article #25250Modification to xinit
From: clyde
Date: Tue, 24 Mar 1987 21:09
Date: Tue, 24 Mar 1987 21:09
143 lines
4366 bytes
4366 bytes
Here are some changes I found useful for xinit. There are:
1. Set up all clients in a unique process group. When the
client returns, send a SIGHUP to that process group so that
any other lingering clients can clean up and exit.
2. Wait for the server to really start up. On loaded machines
(such as my SUN when sendmail fires up), the X server may take
several seconds to start up, and xinit's "I'll give the server
a few seconds to get going" attitude fails. Only after the server
is responding to clients is the client command started up.
These mods tend to make startup and shutdown take a bit more time, but
it's worth it to me to alleviate some race conditions. Of course, there
are still some 'Well that should be enough time' sleeps in the code, but
they don't seem to be troublesome.
---------------- Cut here ------------
*** /u/X/xinit/xinit.c Mon Dec 1 18:51:40 1986
--- xinit.c Tue Mar 24 14:40:45 1987
***************
*** 62,68
perror(server[0]);
exit(1);
}
! sleep(5);
if ((clientpid = fork()) == 0) {
execvp(client[0], client);
perror(client[0]);
--- 62,72 -----
perror(server[0]);
exit(1);
}
! if (waitforserver() == 0) {
! perror("Server wait");
! kill(serverpid, SIGKILL);
! exit(1);
! }
if ((clientpid = fork()) == 0) {
setpgrp(0, getpid());
execvp(client[0], client);
***************
*** 64,69
}
sleep(5);
if ((clientpid = fork()) == 0) {
execvp(client[0], client);
perror(client[0]);
exit(1);
--- 68,74 -----
exit(1);
}
if ((clientpid = fork()) == 0) {
+ setpgrp(0, getpid());
execvp(client[0], client);
perror(client[0]);
exit(1);
***************
*** 74,80
exit(1);
}
while (((pid = wait(NULL)) != clientpid) && (pid != serverpid)) ;
! kill(clientpid, SIGKILL);
if (!kill(serverpid, SIGHUP)) {
sleep(1);
kill(serverpid, SIGKILL);
--- 79,90 -----
exit(1);
}
while (((pid = wait(NULL)) != clientpid) && (pid != serverpid)) ;
! /* HUP all local clients to allow them to clean up */
! if (killpg(clientpid, SIGHUP) == 0)
! sleep(2);
! /* Murder the local clients */
! killpg(clientpid, SIGKILL);
! /* Now tell the server to clean up */
if (!kill(serverpid, SIGHUP)) {
sleep(1);
kill(serverpid, SIGKILL); /* Now make server die */
***************
*** 77,82
kill(clientpid, SIGKILL);
if (!kill(serverpid, SIGHUP)) {
sleep(1);
! kill(serverpid, SIGKILL);
}
}
--- 87,93 -----
/* Now tell the server to clean up */
if (!kill(serverpid, SIGHUP)) {
sleep(1);
! kill(serverpid, SIGKILL); /* Now make server die */
}
exit(0);
}
***************
*** 79,82
sleep(1);
kill(serverpid, SIGKILL);
}
}
--- 89,121 -----
sleep(1);
kill(serverpid, SIGKILL); /* Now make server die */
}
+ exit(0);
+ }
+
+
+ /*
+ * waitforserver - wait for X server to start up
+ */
+ #include <X/Xlib.h>
+ int ncycles = 120;
+
+ waitforserver()
+ {
+ int cycles; /* Wait cycle count */
+ Display *xd; /* Temp */
+ char *display = "unix:0", /* Display name */
+ *envd; /* From environment */
+ extern char *getenv();
+
+ if (envd = getenv("DISPLAY"))
+ display = envd;
+ for (cycles = 0; cycles < ncycles; cycles++) {
+ if (xd = XOpenDisplay(display)) {
+ XCloseDisplay(xd);
+ return(1);
+ }
+ else
+ sleep(1);
+ }
+ return(0);
}
--
Shouter-To-Dead-Parrots @ Univ. of Texas Computation Center; Austin, Texas
clyde@ngp.cc.utexas.edu; ...!ut-sally!ut-ngp!clyde
"It's a sort of a threat, you see. I've never been very good at them
myself, but I've told they can be very effective."
Technical Details
Message-ID:
<4883@ut-ngp.UUCP>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!water!watnot!watmath!clyde!rutgers!seismo!ut-sally!ut-ngp!clydeShow Full Headers
Complete Article Headers
Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: arc1-ca.pugleaf.net!utzoo!utgpu!water!watnot!watmath!clyde!rutgers!seismo!ut-sally!ut-ngp!clyde From: clyde@ut-ngp.UUCP Newsgroups: comp.windows.x Subject: Modification to xinit Message-ID: <4883@ut-ngp.UUCP> Date: Tue, 24-Mar-87 16:09:30 EST Article-I.D.: ut-ngp.4883 Posted: Tue Mar 24 16:09:30 1987 Date-Received: Thu, 26-Mar-87 06:10:12 EST Organization: Moose & Squirrel Software Lines: 143 Keywords: X windows SUN xinit