From: Ben Pfaff Date: Wed, 18 Jul 2012 17:51:02 +0000 (-0700) Subject: system-stats: Use "smap" instead of "shash". X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=openvswitch;a=commitdiff_plain;h=57c8677b511908b3120df3cbf44244423cfefc34 system-stats: Use "smap" instead of "shash". "smap" is now the appropriate data structure for a string-to-string map. Also changes ovsdb_datum_from_shash() into ovsdb_datum_from_smap() since system-stats related code was the only client. Signed-off-by: Ben Pfaff --- diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c index 58c2a10a..3e6f20bb 100644 --- a/lib/ovsdb-data.c +++ b/lib/ovsdb-data.c @@ -29,6 +29,7 @@ #include "ovsdb-parser.h" #include "json.h" #include "shash.h" +#include "smap.h" #include "sort.h" #include "unicode.h" @@ -1524,27 +1525,26 @@ ovsdb_datum_to_bare(const struct ovsdb_datum *datum, } /* Initializes 'datum' as a string-to-string map whose contents are taken from - * 'sh'. Destroys 'sh'. */ + * 'smap'. Destroys 'smap'. */ void -ovsdb_datum_from_shash(struct ovsdb_datum *datum, struct shash *sh) +ovsdb_datum_from_smap(struct ovsdb_datum *datum, struct smap *smap) { - struct shash_node *node, *next; + struct smap_node *node, *next; size_t i; - datum->n = shash_count(sh); + datum->n = smap_count(smap); datum->keys = xmalloc(datum->n * sizeof *datum->keys); datum->values = xmalloc(datum->n * sizeof *datum->values); i = 0; - SHASH_FOR_EACH_SAFE (node, next, sh) { - datum->keys[i].string = node->name; - datum->values[i].string = node->data; - shash_steal(sh, node); + SMAP_FOR_EACH_SAFE (node, next, smap) { + smap_steal(smap, node, + &datum->keys[i].string, &datum->values[i].string); i++; } assert(i == datum->n); - shash_destroy(sh); + smap_destroy(smap); ovsdb_datum_sort_unique(datum, OVSDB_TYPE_STRING, OVSDB_TYPE_STRING); } diff --git a/lib/ovsdb-data.h b/lib/ovsdb-data.h index 36098663..2e31cc5b 100644 --- a/lib/ovsdb-data.h +++ b/lib/ovsdb-data.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011 Nicira, Inc. +/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ struct ds; struct ovsdb_symbol_table; +struct smap; /* One value of an atomic type (given by enum ovs_atomic_type). */ union ovsdb_atom { @@ -172,7 +173,7 @@ void ovsdb_datum_to_string(const struct ovsdb_datum *, void ovsdb_datum_to_bare(const struct ovsdb_datum *, const struct ovsdb_type *, struct ds *); -void ovsdb_datum_from_shash(struct ovsdb_datum *, struct shash *); +void ovsdb_datum_from_smap(struct ovsdb_datum *, struct smap *); /* Comparison. */ uint32_t ovsdb_datum_hash(const struct ovsdb_datum *, diff --git a/lib/smap.c b/lib/smap.c index ff785981..b81ac09c 100644 --- a/lib/smap.c +++ b/lib/smap.c @@ -125,16 +125,29 @@ smap_remove_node(struct smap *smap, struct smap_node *node) free(node); } -/* Deletes 'node' from 'sh'. Neither the node's key nor its value is freed; - * instead, ownership is transferred to the caller. Returns the node's key. */ -char * -smap_steal(struct smap *smap, struct smap_node *node) +/* Deletes 'node' from 'smap'. + * + * If 'keyp' is nonnull, stores the node's key in '*keyp' and transfers + * ownership to the caller. Otherwise, frees the node's key. Similarly for + * 'valuep' and the node's value. */ +void +smap_steal(struct smap *smap, struct smap_node *node, + char **keyp, char **valuep) { - char *key = node->key; + if (keyp) { + *keyp = node->key; + } else { + free(node->key); + } + + if (valuep) { + *valuep = node->value; + } else { + free(node->value); + } hmap_remove(&smap->map, &node->node); free(node); - return key; } /* Removes all key-value pairs from 'smap'. */ diff --git a/lib/smap.h b/lib/smap.h index 13eec1c4..640c2a82 100644 --- a/lib/smap.h +++ b/lib/smap.h @@ -49,7 +49,7 @@ void smap_replace(struct smap *, const char *, const char *); void smap_remove(struct smap *, const char *); void smap_remove_node(struct smap *, struct smap_node *); -char *smap_steal(struct smap *, struct smap_node *); +void smap_steal(struct smap *, struct smap_node *, char **keyp, char **valuep); void smap_clear(struct smap *); const char *smap_get(const struct smap *, const char *); diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index fa835e73..41ad5928 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -1875,14 +1875,14 @@ static void refresh_system_stats(const struct ovsrec_open_vswitch *cfg) { struct ovsdb_datum datum; - struct shash stats; + struct smap stats; - shash_init(&stats); + smap_init(&stats); if (enable_system_stats(cfg)) { get_system_stats(&stats); } - ovsdb_datum_from_shash(&datum, &stats); + ovsdb_datum_from_smap(&datum, &stats); ovsdb_idl_txn_write(&cfg->header_, &ovsrec_open_vswitch_col_statistics, &datum); } diff --git a/vswitchd/system-stats.c b/vswitchd/system-stats.c index cecd8f48..4dc2723c 100644 --- a/vswitchd/system-stats.c +++ b/vswitchd/system-stats.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010 Nicira, Inc. +/* Copyright (c) 2010, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ #include +#include "system-stats.h" + #include #include #include @@ -34,7 +36,7 @@ #include "dirs.h" #include "dynamic-string.h" #include "shash.h" -#include "system-stats.h" +#include "smap.h" #include "timeval.h" #include "vlog.h" @@ -52,24 +54,23 @@ VLOG_DEFINE_THIS_MODULE(system_stats); #endif static void -get_cpu_cores(struct shash *stats) +get_cpu_cores(struct smap *stats) { long int n_cores = sysconf(_SC_NPROCESSORS_ONLN); if (n_cores > 0) { - shash_add(stats, "cpu", xasprintf("%ld", n_cores)); + smap_add_format(stats, "cpu", "%ld", n_cores); } } static void -get_load_average(struct shash *stats OVS_UNUSED) +get_load_average(struct smap *stats OVS_UNUSED) { #if HAVE_GETLOADAVG double loadavg[3]; if (getloadavg(loadavg, 3) == 3) { - shash_add(stats, "load_average", - xasprintf("%.2f,%.2f,%.2f", - loadavg[0], loadavg[1], loadavg[2])); + smap_add_format(stats, "load_average", "%.2f,%.2f,%.2f", + loadavg[0], loadavg[1], loadavg[2]); } #endif } @@ -90,7 +91,7 @@ get_page_size(void) } static void -get_memory_stats(struct shash *stats) +get_memory_stats(struct smap *stats) { if (!LINUX) { unsigned int pagesize = get_page_size(); @@ -108,7 +109,7 @@ get_memory_stats(struct shash *stats) mem_total = phys_pages * (pagesize / 1024); mem_used = (phys_pages - avphys_pages) * (pagesize / 1024); - shash_add(stats, "memory", xasprintf("%d,%d", mem_total, mem_used)); + smap_add_format(stats, "memory", "%d,%d", mem_total, mem_used); } else { static const char file_name[] = "/proc/meminfo"; int mem_used, mem_cache, swap_used; @@ -152,9 +153,8 @@ get_memory_stats(struct shash *stats) mem_used = mem_total - mem_free; mem_cache = buffers + cached; swap_used = swap_total - swap_free; - shash_add(stats, "memory", - xasprintf("%d,%d,%d,%d,%d", mem_total, mem_used, mem_cache, - swap_total, swap_used)); + smap_add_format(stats, "memory", "%d,%d,%d,%d,%d", + mem_total, mem_used, mem_cache, swap_total, swap_used); } } @@ -385,7 +385,7 @@ get_process_info(pid_t pid, struct process_info *pinfo) } static void -get_process_stats(struct shash *stats) +get_process_stats(struct smap *stats) { struct dirent *de; DIR *dir; @@ -398,9 +398,9 @@ get_process_stats(struct shash *stats) while ((de = readdir(dir)) != NULL) { struct process_info pinfo; - char *key, *value; char *file_name; char *extension; + char *key; pid_t pid; #ifdef _DIRENT_HAVE_D_TYPE @@ -423,27 +423,23 @@ get_process_stats(struct shash *stats) key = xasprintf("process_%.*s", (int) (extension - de->d_name), de->d_name); - if (shash_find(stats, key)) { - free(key); - continue; - } - - if (LINUX && get_process_info(pid, &pinfo)) { - value = xasprintf("%lu,%lu,%lld,%d,%lld,%lld", - pinfo.vsz, pinfo.rss, pinfo.cputime, - pinfo.crashes, pinfo.booted, pinfo.uptime); - } else { - value = xstrdup(""); + if (!smap_get(stats, key)) { + if (LINUX && get_process_info(pid, &pinfo)) { + smap_add_format(stats, key, "%lu,%lu,%lld,%d,%lld,%lld", + pinfo.vsz, pinfo.rss, pinfo.cputime, + pinfo.crashes, pinfo.booted, pinfo.uptime); + } else { + smap_add(stats, key, ""); + } } - - shash_add_nocopy(stats, key, value); + free(key); } closedir(dir); } static void -get_filesys_stats(struct shash *stats OVS_UNUSED) +get_filesys_stats(struct smap *stats OVS_UNUSED) { #if HAVE_SETMNTENT && HAVE_STATVFS static const char file_name[] = "/etc/mtab"; @@ -489,14 +485,14 @@ get_filesys_stats(struct shash *stats OVS_UNUSED) endmntent(stream); if (s.length) { - shash_add(stats, "file_systems", ds_steal_cstr(&s)); + smap_add(stats, "file_systems", ds_cstr(&s)); } ds_destroy(&s); #endif /* HAVE_SETMNTENT && HAVE_STATVFS */ } void -get_system_stats(struct shash *stats) +get_system_stats(struct smap *stats) { get_cpu_cores(stats); get_load_average(stats); diff --git a/vswitchd/system-stats.h b/vswitchd/system-stats.h index ac4a65e3..9f965c63 100644 --- a/vswitchd/system-stats.h +++ b/vswitchd/system-stats.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010 Nicira, Inc. +/* Copyright (c) 2010, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ #ifndef VSWITCHD_SYSTEM_STATS #define VSWITCHD_SYSTEM_STATS 1 -void get_system_stats(struct shash *); +struct smap; + +void get_system_stats(struct smap *); #endif /* vswitchd/system-stats.h */