Simple enough, here's another incremental (on top of the original patch).
Ethan
---
lib/timeval.c | 30 +++++++++++++++++++++++++-----
lib/timeval.h | 16 +---------------
tests/test-timeval.c | 4 ++--
3 files changed, 28 insertions(+), 22 deletions(-)
diff --git a/lib/timeval.c b/lib/timeval.c
index 1fa099d..77247e8 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -40,10 +40,13 @@ VLOG_DEFINE_THIS_MODULE(timeval);
* to CLOCK_REALTIME. */
static clockid_t monotonic_clock;
-/* Has the same meaning as the CACHE_TIME define. On some systems
- * timer_create() is not implemented, in which case this variable can be
- * overwridden. */
-static bool cache_time = CACHE_TIME;
+/* Controls whether or not calls to clock_gettime() are cached. See
+ * time_cached() for a detailed explanation. */
+#if defined __x86_64__ && defined __linux__
+static bool cache_time = false;
+#else
+static bool cache_time = true;
+#endif
/* Has a timer tick occurred? Only relevant if cache_time is true.
*
@@ -353,7 +356,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds, long long
int timeout_when,
break;
}
- if (!blocked && !CACHE_TIME) {
+ if (!blocked && !cache_time) {
block_sigalrm(&oldsigs);
blocked = true;
}
@@ -367,6 +370,23 @@ time_poll(struct pollfd *pollfds, int n_pollfds, long long
int timeout_when,
return retval;
}
+/* True on systems (particularly x86-64 Linux) where clock_gettime() is
+ * inexpensive. On these systems, we don't bother caching the current time.
+ * Instead, we consult clock_gettime() directly when needed.
+ *
+ * False on systems where clock_gettime() is relatively expensive. On these
+ * systems, we cache the current time and set up a periodic SIGALRM to remind
+ * us to update it.
+ *
+ * Also false on systems (e.g. ESX) that don't support setting up timers based
+ * on a monotonically increasing clock. */
+bool
+time_cached(void)
+{
+ time_init();
+ return cache_time;
+}
+
static void
sigalrm_handler(int sig_nr OVS_UNUSED)
{
diff --git a/lib/timeval.h b/lib/timeval.h
index 1384848..d9eb3c7 100644
--- a/lib/timeval.h
+++ b/lib/timeval.h
@@ -36,21 +36,6 @@ BUILD_ASSERT_DECL(TYPE_IS_INTEGER(time_t));
* ever encounter such a platform. */
BUILD_ASSERT_DECL(TYPE_IS_SIGNED(time_t));
-/* On x86-64 systems, Linux avoids using syscalls for clock_gettime().
- *
- * For systems which do invoke a system call we wait at least
- * TIME_UPDATE_INTERVAL ms between clock_gettime() calls and cache the time for
- * the interim.
- *
- * For systems which do not invoke a system call, we just call clock_gettime()
- * whenever the time is requested. As a result we don't start the background
- * SIGALRM timer unless explicitly needed by time_alarm() */
-#if defined __x86_64__ && defined __linux__
-#define CACHE_TIME 0
-#else
-#define CACHE_TIME 1
-#endif
-
#define TIME_MAX TYPE_MAXIMUM(time_t)
#define TIME_MIN TYPE_MINIMUM(time_t)
@@ -72,6 +57,7 @@ void time_wall_timespec(struct timespec *);
void time_alarm(unsigned int secs);
int time_poll(struct pollfd *, int n_pollfds, long long int timeout_when,
int *elapsed);
+bool time_cached(void);
long long int timespec_to_msec(const struct timespec *);
long long int timeval_to_msec(const struct timeval *);
diff --git a/tests/test-timeval.c b/tests/test-timeval.c
index 9896cf7..a58c041 100644
--- a/tests/test-timeval.c
+++ b/tests/test-timeval.c
@@ -99,7 +99,7 @@ main(int argc, char *argv[])
} else if (!strcmp(argv[1], "plain")) {
/* If we're not caching time there isn't much to test and SIGALRM won't
* be around to pull us out of the select() call, so just skip out */
- if (!CACHE_TIME) {
+ if (!time_cached()) {
exit (77);
}
@@ -110,7 +110,7 @@ main(int argc, char *argv[])
char cwd[1024], *pidfile;
FILE *success;
- if (!CACHE_TIME) {
+ if (!time_cached()) {
exit (77);
}
--
1.7.12
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev