aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver/os/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/Xserver/os/utils.c')
-rw-r--r--nx-X11/programs/Xserver/os/utils.c164
1 files changed, 93 insertions, 71 deletions
diff --git a/nx-X11/programs/Xserver/os/utils.c b/nx-X11/programs/Xserver/os/utils.c
index af793454f..25cbb1e87 100644
--- a/nx-X11/programs/Xserver/os/utils.c
+++ b/nx-X11/programs/Xserver/os/utils.c
@@ -290,7 +290,8 @@ OsSignal(sig, handler)
sigaddset(&act.sa_mask, sig);
act.sa_flags = 0;
act.sa_handler = handler;
- sigaction(sig, &act, &oact);
+ if (sigaction(sig, &act, &oact))
+ perror("sigaction");
return oact.sa_handler;
#endif
}
@@ -1026,10 +1027,12 @@ ProcessCommandLine(int argc, char *argv[])
i = skip - 1;
}
#endif
+#if HAVE_SETITIMER
else if ( strcmp( argv[i], "-dumbSched") == 0)
{
- SmartScheduleDisable = TRUE;
+ SmartScheduleSignalEnable = FALSE;
}
+#endif
else if ( strcmp( argv[i], "-schedInterval") == 0)
{
if (++i < argc)
@@ -1353,30 +1356,15 @@ XNFstrdup(const char *s)
return ret;
}
-unsigned long SmartScheduleIdleCount;
-Bool SmartScheduleIdle;
-Bool SmartScheduleTimerStopped;
-
-#ifdef SIGVTALRM
-#define SMART_SCHEDULE_POSSIBLE
-#endif
-
-#ifdef SMART_SCHEDULE_POSSIBLE
-#define SMART_SCHEDULE_SIGNAL SIGALRM
-#define SMART_SCHEDULE_TIMER ITIMER_REAL
-#endif
-
-#ifdef NX_TRANS_SOCKET
void
SmartScheduleStopTimer (void)
-#else
-static void
-SmartScheduleStopTimer (void)
-#endif
{
-#ifdef SMART_SCHEDULE_POSSIBLE
+#if HAVE_SETITIMER
struct itimerval timer;
+ if (!SmartScheduleSignalEnable)
+ return;
+
#ifdef NX_TRANS_TEST
fprintf(stderr, "SmartScheduleStopTimer: Stopping timer.\n");
#endif
@@ -1386,96 +1374,101 @@ SmartScheduleStopTimer (void)
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 0;
(void) setitimer (ITIMER_REAL, &timer, 0);
- SmartScheduleTimerStopped = TRUE;
#endif
}
-Bool
+void
SmartScheduleStartTimer (void)
{
-#ifdef SMART_SCHEDULE_POSSIBLE
+#if HAVE_SETITIMER
struct itimerval timer;
- #ifdef NX_TRANS_SOCKET
-
- if (SmartScheduleDisable)
- {
- return FALSE;
- }
-
- #endif
+ if (!SmartScheduleSignalEnable)
+ return;
#ifdef NX_TRANS_TEST
fprintf(stderr, "SmartScheduleStartTimer: Starting timer with [%ld] ms.\n",
SmartScheduleInterval);
#endif
- SmartScheduleTimerStopped = FALSE;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = SmartScheduleInterval * 1000;
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = SmartScheduleInterval * 1000;
- return setitimer (ITIMER_REAL, &timer, 0) >= 0;
+ setitimer (ITIMER_REAL, &timer, 0);
#endif
- return FALSE;
}
-#ifdef SMART_SCHEDULE_POSSIBLE
+#if HAVE_SETITIMER
static void
SmartScheduleTimer (int sig)
{
- int olderrno = errno;
-
SmartScheduleTime += SmartScheduleInterval;
#ifdef NX_TRANS_TEST
fprintf(stderr, "SmartScheduleTimer: Got timer with time [%ld] ms.\n",
SmartScheduleTime);
#endif
-
- if (SmartScheduleIdle)
- {
- SmartScheduleStopTimer ();
- }
- errno = olderrno;
}
-#endif
-Bool
-SmartScheduleInit (void)
+int
+SmartScheduleEnable (void)
{
-#ifdef SMART_SCHEDULE_POSSIBLE
+ int ret = 0;
struct sigaction act;
- if (SmartScheduleDisable)
- return TRUE;
-
+ if (!SmartScheduleSignalEnable)
+ return 0;
+
#ifdef NX_TRANS_TEST
- fprintf(stderr, "SmartScheduleInit: Initializing the smart scheduler.\n");
+ fprintf(stderr, "SmartScheduleEnable: Enabling the smart scheduler.\n");
#endif
- bzero ((char *) &act, sizeof(struct sigaction));
+ memset((char *) &act, 0, sizeof(struct sigaction));
/* Set up the timer signal function */
+ act.sa_flags = SA_RESTART;
act.sa_handler = SmartScheduleTimer;
sigemptyset (&act.sa_mask);
- sigaddset (&act.sa_mask, SMART_SCHEDULE_SIGNAL);
- if (sigaction (SMART_SCHEDULE_SIGNAL, &act, 0) < 0)
- {
- perror ("sigaction for smart scheduler");
- return FALSE;
- }
- /* Set up the virtual timer */
- if (!SmartScheduleStartTimer ())
- {
- perror ("scheduling timer");
- return FALSE;
+ sigaddset (&act.sa_mask, SIGALRM);
+ ret = sigaction(SIGALRM, &act, 0);
+ return ret;
+}
+
+static int
+SmartSchedulePause(void)
+{
+ int ret = 0;
+ struct sigaction act;
+
+ if (!SmartScheduleSignalEnable)
+ return 0;
+
+ #ifdef NX_TRANS_TEST
+ fprintf(stderr, "SmartSchedulePause: Pausing the smart scheduler.\n");
+ #endif
+
+ memset((char *) &act, 0, sizeof(struct sigaction));
+
+ act.sa_handler = SIG_IGN;
+ sigemptyset(&act.sa_mask);
+ ret = sigaction(SIGALRM, &act, 0);
+ return ret;
+}
+#endif
+
+void
+SmartScheduleInit(void)
+{
+#if HAVE_SETITIMER
+ #ifdef NX_TRANS_TEST
+ fprintf(stderr, "SmartScheduleInit: Initializing the smart scheduler.\n");
+ #endif
+
+ if (SmartScheduleEnable() < 0) {
+ perror("sigaction for smart scheduler");
+ SmartScheduleSignalEnable = FALSE;
}
- /* stop the timer and wait for WaitForSomething to start it */
- SmartScheduleStopTimer ();
- return TRUE;
-#else
- return FALSE;
#endif
}
@@ -1558,7 +1551,11 @@ System(char *command)
return(1);
#ifdef SIGCHLD
- csig = signal(SIGCHLD, SIG_DFL);
+ csig = OsSignal(SIGCHLD, SIG_DFL);
+ if (csig == SIG_ERR) {
+ perror("signal");
+ return -1;
+ }
#endif
#ifdef DEBUG
@@ -1596,7 +1593,10 @@ System(char *command)
#endif
#ifdef SIGCHLD
- signal(SIGCHLD, csig);
+ if (OsSignal(SIGCHLD, csig) == SIG_ERR) {
+ perror("signal");
+ return -1;
+ }
#endif
return p == -1 ? -1 : status;
@@ -1629,6 +1629,17 @@ Popen(char *command, char *type)
return NULL;
}
+ /* Ignore the smart scheduler while this is going on */
+#if HAVE_SETITIMER
+ if (SmartSchedulePause() < 0) {
+ close(pdes[0]);
+ close(pdes[1]);
+ free(cur);
+ perror("signal");
+ return NULL;
+ }
+#endif
+
#ifdef NX_TRANS_EXIT
if (OsVendorStartRedirectErrorFProc != NULL) {
OsVendorStartRedirectErrorFProc();
@@ -1640,6 +1651,10 @@ Popen(char *command, char *type)
close(pdes[0]);
close(pdes[1]);
free(cur);
+#if HAVE_SETITIMER
+ if (SmartScheduleEnable() < 0)
+ perror("signal");
+#endif
#ifdef NX_TRANS_EXIT
if (OsVendorEndRedirectErrorFProc != NULL) {
OsVendorEndRedirectErrorFProc();
@@ -1714,6 +1729,13 @@ Popen(char *command, char *type)
OsReleaseSignals ();
#endif
+#if HAVE_SETITIMER
+ if (SmartScheduleEnable() < 0) {
+ perror("signal");
+ return NULL;
+ }
+#endif
+
execl("/bin/sh", "sh", "-c", command, (char *)NULL);
_exit(127);
}