On Wed, Jul 10, 2013 at 4:03 PM, Ben Pfaff <b...@nicira.com> wrote: > The worker process implementation isn't thread-safe and, once OVS > itself is threaded, it doesn't make much sense to have a worker > process anyway. > > Signed-off-by: Ben Pfaff <b...@nicira.com> > Looks good.
> --- > vswitchd/system-stats.c | 145 > ++++++++--------------------------------------- > 1 files changed, 24 insertions(+), 121 deletions(-) > > diff --git a/vswitchd/system-stats.c b/vswitchd/system-stats.c > index f0f53c0..e7c1d73 100644 > --- a/vswitchd/system-stats.c > +++ b/vswitchd/system-stats.c > @@ -41,7 +41,6 @@ > #include "smap.h" > #include "timeval.h" > #include "vlog.h" > -#include "worker.h" > > VLOG_DEFINE_THIS_MODULE(system_stats); > > @@ -505,46 +504,17 @@ get_filesys_stats(struct smap *stats OVS_UNUSED) > > #define SYSTEM_STATS_INTERVAL (5 * 1000) /* In milliseconds. */ > > -/* Whether the client wants us to report system stats. */ > -static bool enabled; > +/* The next time to wake up, or LLONG_MAX if stats are disabled. */ > +static long long int next_refresh = LLONG_MAX; > > -static enum { > - S_DISABLED, /* Not enabled, nothing going on. */ > - S_WAITING, /* Sleeping for SYSTEM_STATS_INTERVAL ms. > */ > - S_REQUEST_SENT, /* Sent a request to worker. */ > - S_REPLY_RECEIVED /* Received a reply from worker. */ > -} state; > - > -/* In S_WAITING state: the next time to wake up. > - * In other states: not meaningful. */ > -static long long int next_refresh; > - > -/* In S_REPLY_RECEIVED: the stats that have just been received. > - * In other states: not meaningful. */ > -static struct smap *received_stats; > - > -static worker_request_func system_stats_request_cb; > -static worker_reply_func system_stats_reply_cb; > - > -/* Enables or disables system stats collection, according to 'new_enable'. > - * > - * Even if system stats are disabled, the caller should still > periodically call > - * system_stats_run(). */ > +/* Enables or disables system stats collection, according to 'enable'. */ > void > -system_stats_enable(bool new_enable) > +system_stats_enable(bool enable) > { > - if (new_enable != enabled) { > - if (new_enable) { > - if (state == S_DISABLED) { > - state = S_WAITING; > - next_refresh = time_msec(); > - } > - } else { > - if (state == S_WAITING) { > - state = S_DISABLED; > - } > - } > - enabled = new_enable; > + if (!enable) { > + next_refresh = LLONG_MAX; > + } else if (next_refresh == LLONG_MAX) { > + next_refresh = time_msec(); > } > } > > @@ -553,38 +523,26 @@ system_stats_enable(bool new_enable) > * > * When a new snapshot is available (which only occurs if system stats are > * enabled), returns it as an smap owned by the caller. The caller must > use > - * both smap_destroy() and free() to complete free the returned data. > + * both smap_destroy() and free() to completely free the returned data. > * > * When no new snapshot is available, returns NULL. */ > struct smap * > system_stats_run(void) > { > - switch (state) { > - case S_DISABLED: > - break; > - > - case S_WAITING: > - if (time_msec() >= next_refresh) { > - worker_request(NULL, 0, NULL, 0, system_stats_request_cb, > - system_stats_reply_cb, NULL); > - state = S_REQUEST_SENT; > - } > - break; > - > - case S_REQUEST_SENT: > - break; > - > - case S_REPLY_RECEIVED: > - if (enabled) { > - state = S_WAITING; > - next_refresh = time_msec() + SYSTEM_STATS_INTERVAL; > - return received_stats; > - } else { > - smap_destroy(received_stats); > - free(received_stats); > - state = S_DISABLED; > - } > - break; > + if (time_msec() >= next_refresh) { > + struct smap *stats; > + > + stats = xmalloc(sizeof *stats); > + smap_init(stats); > + get_cpu_cores(stats); > + get_load_average(stats); > + get_memory_stats(stats); > + get_process_stats(stats); > + get_filesys_stats(stats); > + > + next_refresh = time_msec() + SYSTEM_STATS_INTERVAL; > + > + return stats; > } > > return NULL; > @@ -595,62 +553,7 @@ system_stats_run(void) > void > system_stats_wait(void) > { > - switch (state) { > - case S_DISABLED: > - break; > - > - case S_WAITING: > + if (next_refresh != LLONG_MAX) { > poll_timer_wait_until(next_refresh); > - break; > - > - case S_REQUEST_SENT: > - /* Someone else should be calling worker_wait() to wake up when > the > - * reply arrives, otherwise there's a bug. */ > - break; > - > - case S_REPLY_RECEIVED: > - poll_immediate_wake(); > - break; > } > } > - > -static void > -system_stats_request_cb(struct ofpbuf *request OVS_UNUSED, > - const int fds[] OVS_UNUSED, size_t n_fds > OVS_UNUSED) > -{ > - struct smap stats; > - struct json *json; > - char *s; > - > - smap_init(&stats); > - get_cpu_cores(&stats); > - get_load_average(&stats); > - get_memory_stats(&stats); > - get_process_stats(&stats); > - get_filesys_stats(&stats); > - > - json = smap_to_json(&stats); > - s = json_to_string(json, 0); > - worker_reply(s, strlen(s) + 1, NULL, 0); > - > - free(s); > - json_destroy(json); > - smap_destroy(&stats); > -} > - > -static void > -system_stats_reply_cb(struct ofpbuf *reply, > - const int fds[] OVS_UNUSED, size_t n_fds OVS_UNUSED, > - void *aux OVS_UNUSED) > -{ > - struct json *json = json_from_string(reply->data); > - > - received_stats = xmalloc(sizeof *received_stats); > - smap_init(received_stats); > - smap_from_json(received_stats, json); > - > - ovs_assert(state == S_REQUEST_SENT); > - state = S_REPLY_RECEIVED; > - > - json_destroy(json); > -} > -- > 1.7.2.5 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev >
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev