summaryrefslogtreecommitdiff
path: root/os
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2007-10-28 09:37:52 +0100
committerKeith Packard <keithp@koto.keithp.com>2007-10-30 11:18:56 -0700
commit2338d5c9914e2a43c3a4f7ee0f4355ad0a1ad9e7 (patch)
tree9f43e0c2cd7ae5ab2e5944c5bba03384c96ce47a /os
parent692654b4300e61a9481e6fa588bcb44a3c3ca150 (diff)
reduce wakeups from smart scheduler
The smart scheduler itimer currently always fires after each request (which in turn causes the CPU to wake out of idle, burning precious power). Rather than doing this, just stop the timer before going into the select() portion of the WaitFor loop. It's a cheap system call, and it will only get called if there's no more commands batched up from the active fd. This change also allows some of the functions to be simplified; setitimer() will only fail if it's passed invalid data, and we don't do that... so make it void and remove all the conditional code that deals with failure. The change also allows us to remove a few variables that were used for housekeeping between the signal handler and the main loop. Signed-off-by: Keith Packard <keithp@koto.keithp.com>
Diffstat (limited to 'os')
-rw-r--r--os/WaitFor.c11
-rw-r--r--os/utils.c28
2 files changed, 6 insertions, 33 deletions
diff --git a/os/WaitFor.c b/os/WaitFor.c
index ec1592c01..7683477e6 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -217,7 +217,8 @@ WaitForSomething(int *pClientsReady)
XFD_COPYSET(&AllSockets, &LastSelectMask);
#ifdef SMART_SCHEDULE
}
- SmartScheduleIdle = TRUE;
+ SmartScheduleStopTimer ();
+
#endif
BlockHandler((pointer)&wt, (pointer)&LastSelectMask);
if (NewOutputPending)
@@ -237,13 +238,7 @@ WaitForSomething(int *pClientsReady)
selecterr = GetErrno();
WakeupHandler(i, (pointer)&LastSelectMask);
#ifdef SMART_SCHEDULE
- if (i >= 0)
- {
- SmartScheduleIdle = FALSE;
- SmartScheduleIdleCount = 0;
- if (SmartScheduleTimerStopped)
- (void) SmartScheduleStartTimer ();
- }
+ SmartScheduleStartTimer ();
#endif
if (i <= 0) /* An error or timeout occurred */
{
diff --git a/os/utils.c b/os/utils.c
index 31cb0af92..6fc1f7d43 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -1513,10 +1513,6 @@ XNFstrdup(const char *s)
#ifdef SMART_SCHEDULE
-unsigned long SmartScheduleIdleCount;
-Bool SmartScheduleIdle;
-Bool SmartScheduleTimerStopped;
-
#ifdef SIGVTALRM
#define SMART_SCHEDULE_POSSIBLE
#endif
@@ -1526,7 +1522,7 @@ Bool SmartScheduleTimerStopped;
#define SMART_SCHEDULE_TIMER ITIMER_REAL
#endif
-static void
+void
SmartScheduleStopTimer (void)
{
#ifdef SMART_SCHEDULE_POSSIBLE
@@ -1537,38 +1533,28 @@ 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
struct itimerval timer;
- 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
static void
SmartScheduleTimer (int sig)
{
- int olderrno = errno;
-
SmartScheduleTime += SmartScheduleInterval;
- if (SmartScheduleIdle)
- {
- SmartScheduleStopTimer ();
- }
- errno = olderrno;
}
#endif
@@ -1592,14 +1578,6 @@ SmartScheduleInit (void)
perror ("sigaction for smart scheduler");
return FALSE;
}
- /* Set up the virtual timer */
- if (!SmartScheduleStartTimer ())
- {
- perror ("scheduling timer");
- return FALSE;
- }
- /* stop the timer and wait for WaitForSomething to start it */
- SmartScheduleStopTimer ();
return TRUE;
#else
return FALSE;