system-stats: Use "smap" instead of "shash".
authorBen Pfaff <blp@nicira.com>
Wed, 18 Jul 2012 17:51:02 +0000 (10:51 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 18 Jul 2012 17:51:02 +0000 (10:51 -0700)
"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 <blp@nicira.com>
lib/ovsdb-data.c
lib/ovsdb-data.h
lib/smap.c
lib/smap.h
vswitchd/bridge.c
vswitchd/system-stats.c
vswitchd/system-stats.h

index 58c2a10a076fc98936ea398c6b28b3ed42d07089..3e6f20bbee239b85291e0680891d9d608d4fb8de 100644 (file)
@@ -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);
 }
 
index 360986633868584e0ba58634c808331b43ee2b0d..2e31cc5b9c62a1a22fe0e3395c2d6727bb2e16c2 100644 (file)
@@ -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 *,
index ff785981226425d7a42dd34e44e44d2ea617a295..b81ac09c2509c46878c4c46eec1023ece877690f 100644 (file)
@@ -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'. */
index 13eec1c4f4d6262f3c458f3761a52c64f13a6f40..640c2a82c536787122907afd4fa9affd063e50ef 100644 (file)
@@ -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 *);
index fa835e732eb47e755e87d9370d620302322fbecf..41ad5928c7d6957ec9e159b48a2278c760a6ad4f 100644 (file)
@@ -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);
 }
index cecd8f482cb506dbbf8ca295c97639b95e2debaa..4dc2723c23521b9a50cba1ba0f3aaf45a9de4c60 100644 (file)
@@ -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 <config.h>
 
+#include "system-stats.h"
+
 #include <assert.h>
 #include <ctype.h>
 #include <dirent.h>
@@ -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);
index ac4a65e3c83933d8b18f70b43c95794aebb15ee3..9f965c632930257cc8f23971585ae1152b428be9 100644 (file)
@@ -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 */