X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Ftimeval.c;h=099730e8f921a30e5bc48bbeacb748febd0750f3;hb=7fae24e67c95b1dbe93497135ae533e39b61e110;hp=d24ba03f794a57dc4904291f304d6aecee5b6a0b;hpb=d98e60075528c3065ad453f7add4b30f22edcde3;p=openvswitch diff --git a/lib/timeval.c b/lib/timeval.c index d24ba03f..099730e8 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ #include #include "coverage.h" #include "fatal-signal.h" +#include "signals.h" #include "util.h" #include "vlog.h" @@ -96,9 +97,7 @@ set_up_signal(int flags) sa.sa_handler = sigalrm_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = flags; - if (sigaction(SIGALRM, &sa, NULL)) { - ovs_fatal(errno, "sigaction(SIGALRM) failed"); - } + xsigaction(SIGALRM, &sa, NULL); } /* Remove SA_RESTART from the flags for SIGALRM, so that any system call that @@ -137,7 +136,7 @@ set_up_timer(void) struct itimerspec itimer; if (timer_create(monotonic_clock, NULL, &timer_id)) { - ovs_fatal(errno, "timer_create failed"); + VLOG_FATAL("timer_create failed (%s)", strerror(errno)); } itimer.it_interval.tv_sec = 0; @@ -145,7 +144,7 @@ set_up_timer(void) itimer.it_value = itimer.it_interval; if (timer_settime(timer_id, 0, &itimer, NULL)) { - ovs_fatal(errno, "timer_settime failed"); + VLOG_FATAL("timer_settime failed (%s)", strerror(errno)); } } @@ -364,17 +363,13 @@ block_sigalrm(sigset_t *oldsigs) sigset_t sigalrm; sigemptyset(&sigalrm); sigaddset(&sigalrm, SIGALRM); - if (sigprocmask(SIG_BLOCK, &sigalrm, oldsigs)) { - ovs_fatal(errno, "sigprocmask"); - } + xsigprocmask(SIG_BLOCK, &sigalrm, oldsigs); } static void unblock_sigalrm(const sigset_t *oldsigs) { - if (sigprocmask(SIG_SETMASK, oldsigs, NULL)) { - ovs_fatal(errno, "sigprocmask"); - } + xsigprocmask(SIG_SETMASK, oldsigs, NULL); } long long int @@ -389,6 +384,14 @@ timeval_to_msec(const struct timeval *tv) return (long long int) tv->tv_sec * 1000 + tv->tv_usec / 1000; } +void +xgettimeofday(struct timeval *tv) +{ + if (gettimeofday(tv, NULL) == -1) { + VLOG_FATAL("gettimeofday failed (%s)", strerror(errno)); + } +} + static long long int timeval_diff_msec(const struct timeval *a, const struct timeval *b) { @@ -409,8 +412,9 @@ log_poll_interval(long long int last_wakeup, const struct rusage *last_rusage) now = time_msec(); interval = MIN(10000, now - last_wakeup) << 4; - /* Warn if we took too much time between polls. */ - if (n_samples > 10 && interval > mean_interval * 8) { + /* Warn if we took too much time between polls: at least 50 ms and at least + * 8X the mean interval. */ + if (n_samples > 10 && interval > mean_interval * 8 && interval > 50 * 16) { struct rusage rusage; getrusage(RUSAGE_SELF, &rusage);