Looks good.

Ethan

On Thu, Dec 8, 2011 at 14:01, Ben Pfaff <b...@nicira.com> wrote:
> ---
>  lib/dummy.h   |    3 ++-
>  lib/timeval.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 56 insertions(+), 1 deletions(-)
>
> diff --git a/lib/dummy.h b/lib/dummy.h
> index fe15087..efc1696 100644
> --- a/lib/dummy.h
> +++ b/lib/dummy.h
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2010 Nicira Networks.
> + * Copyright (c) 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.
> @@ -23,5 +23,6 @@ void dummy_enable(void);
>  /* Implementation details. */
>  void dpif_dummy_register(void);
>  void netdev_dummy_register(void);
> +void timeval_dummy_register(void);
>
>  #endif /* dummy.h */
> diff --git a/lib/timeval.c b/lib/timeval.c
> index bc7411f..c8c02bd 100644
> --- a/lib/timeval.c
> +++ b/lib/timeval.c
> @@ -20,13 +20,16 @@
>  #include <errno.h>
>  #include <poll.h>
>  #include <signal.h>
> +#include <stdlib.h>
>  #include <string.h>
>  #include <sys/time.h>
>  #include <sys/resource.h>
>  #include <unistd.h>
>  #include "coverage.h"
> +#include "dummy.h"
>  #include "fatal-signal.h"
>  #include "signals.h"
> +#include "unixctl.h"
>  #include "util.h"
>  #include "vlog.h"
>
> @@ -48,6 +51,9 @@ static volatile sig_atomic_t monotonic_tick = true;
>  static struct timespec wall_time;
>  static struct timespec monotonic_time;
>
> +/* Fixed monotonic time offset, for use by unit tests. */
> +static struct timespec warp_offset;
> +
>  /* Time at which to die with SIGALRM (if not TIME_MIN). */
>  static time_t deadline = TIME_MIN;
>
> @@ -62,6 +68,8 @@ static void unblock_sigalrm(const sigset_t *);
>  static void log_poll_interval(long long int last_wakeup);
>  static struct rusage *get_recent_rusage(void);
>  static void refresh_rusage(void);
> +static void timespec_add(struct timespec *sum,
> +                         const struct timespec *a, const struct timespec *b);
>
>  /* Initializes the timetracking module.
>  *
> @@ -180,6 +188,7 @@ refresh_monotonic(void)
>         refresh_wall_if_ticked();
>         monotonic_time = wall_time;
>     }
> +    timespec_add(&monotonic_time, &monotonic_time, &warp_offset);
>
>     monotonic_tick = false;
>  }
> @@ -408,6 +417,23 @@ timeval_diff_msec(const struct timeval *a, const struct 
> timeval *b)
>  }
>
>  static void
> +timespec_add(struct timespec *sum,
> +             const struct timespec *a,
> +             const struct timespec *b)
> +{
> +    struct timespec tmp;
> +
> +    tmp.tv_sec = a->tv_sec + b->tv_sec;
> +    tmp.tv_nsec = a->tv_nsec + b->tv_nsec;
> +    if (tmp.tv_nsec >= 1000 * 1000 * 1000) {
> +        tmp.tv_nsec -= 1000 * 1000 * 1000;
> +        tmp.tv_sec++;
> +    }
> +
> +    *sum = tmp;
> +}
> +
> +static void
>  log_poll_interval(long long int last_wakeup)
>  {
>     static unsigned int mean_interval; /* In 16ths of a millisecond. */
> @@ -522,3 +548,31 @@ get_cpu_usage(void)
>  {
>     return cpu_usage;
>  }
> +
> +/* Unixctl interface. */
> +
> +static void
> +timeval_warp_cb(struct unixctl_conn *conn,
> +                int argc OVS_UNUSED, const char *argv[], void *aux 
> OVS_UNUSED)
> +{
> +    struct timespec ts;
> +    int msecs;
> +
> +    msecs = atoi(argv[1]);
> +    if (msecs <= 0) {
> +        unixctl_command_reply(conn, 501, "invalid MSECS");
> +        return;
> +    }
> +
> +    ts.tv_sec = msecs / 1000;
> +    ts.tv_nsec = (msecs % 1000) * 1000 * 1000;
> +    timespec_add(&warp_offset, &warp_offset, &ts);
> +    unixctl_command_reply(conn, 200, "warped");
> +}
> +
> +void
> +timeval_dummy_register(void)
> +{
> +    unixctl_command_register("time/warp", "MSECS", 1, 1,
> +                             timeval_warp_cb, NULL);
> +}
> --
> 1.7.4.4
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to