From 1f55911ed4be3926eee7826a161fbb35fc57eb10 Mon Sep 17 00:00:00 2001 From: Lennart Poettering <lennart@poettering.net> Date: Tue, 19 Aug 2008 23:03:37 +0200 Subject: [PATCH] rework cpu limit logic to use monotonic instead of wall clock time --- src/daemon/cpulimit.c | 15 +++++++++------ src/pulsecore/rtclock.h | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/daemon/cpulimit.c b/src/daemon/cpulimit.c index 620a93a..fc9abda 100644 --- a/src/daemon/cpulimit.c +++ b/src/daemon/cpulimit.c @@ -26,11 +26,13 @@ #endif #include <pulse/error.h> +#include <pulse/timeval.h> #include <pulsecore/core-util.h> #include <pulsecore/core-error.h> #include <pulsecore/log.h> #include <pulsecore/macro.h> +#include <pulsecore/rtclock.h> #include "cpulimit.h" @@ -69,7 +71,7 @@ #define CPUTIME_INTERVAL_HARD (5) /* Time of the last CPU load check */ -static time_t last_time = 0; +static pa_usec_t last_time = 0; /* Pipe for communicating with the main loop */ static int the_pipe[2] = {-1, -1}; @@ -119,20 +121,21 @@ static void signal_handler(int sig) { pa_assert(sig == SIGXCPU); if (phase == PHASE_IDLE) { - time_t now; + pa_usec_t now, elapsed; #ifdef PRINT_CPU_LOAD char t[256]; #endif - time(&now); + now = pa_rtclock_usec(); + elapsed = now - last_time; #ifdef PRINT_CPU_LOAD - pa_snprintf(t, sizeof(t), "Using %0.1f%% CPU\n", (double)CPUTIME_INTERVAL_SOFT/(now-last_time)*100); + pa_snprintf(t, sizeof(t), "Using %0.1f%% CPU\n", ((double) CPUTIME_INTERVAL_SOFT * (double) PA_USEC_PER_SEC) / (double) elapsed * 100.0); write_err(t); #endif - if (CPUTIME_INTERVAL_SOFT >= ((now-last_time)*(double)CPUTIME_PERCENT/100)) { + if (((double) CPUTIME_INTERVAL_SOFT * (double) PA_USEC_PER_SEC) >= ((double) elapsed * (double) CPUTIME_PERCENT / 100.0)) { static const char c = 'X'; write_err("Soft CPU time limit exhausted, terminating.\n"); @@ -181,7 +184,7 @@ int pa_cpu_limit_init(pa_mainloop_api *m) { pa_assert(the_pipe[1] == -1); pa_assert(!installed); - time(&last_time); + last_time = pa_rtclock_usec(); /* Prepare the main loop pipe */ if (pipe(the_pipe) < 0) { diff --git a/src/pulsecore/rtclock.h b/src/pulsecore/rtclock.h index f0360af..81ccfb3 100644 --- a/src/pulsecore/rtclock.h +++ b/src/pulsecore/rtclock.h @@ -25,6 +25,7 @@ ***/ #include <pulsecore/macro.h> +#include <pulse/sample.h> struct timeval; -- 1.6.0.2