[ovs-dev] [mirror names 06/10] vswitch: Use ovsdb_idl_get() to avoid O(n) in get_ovsrec_key_value().

Ben Pfaff blp at nicira.com
Thu Jun 17 22:57:17 UTC 2010


---
 vswitchd/bridge.c |   32 ++++++++++++++++----------------
 1 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 47f269f..4501904 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -856,25 +856,25 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg)
 }
 
 static const char *
-get_ovsrec_key_value(const char *key, char **keys, char **values, size_t n)
+get_ovsrec_key_value(const struct ovsdb_idl_row *row,
+                     const struct ovsdb_idl_column *column,
+                     const char *key)
 {
-    size_t i;
+    const struct ovsdb_datum *datum;
+    union ovsdb_atom atom;
+    unsigned int idx;
 
-    for (i = 0; i < n; i++) {
-        if (!strcmp(keys[i], key)) {
-            return values[i];
-        }
-    }
-    return NULL;
+    datum = ovsdb_idl_get(row, column, OVSDB_TYPE_STRING, OVSDB_TYPE_STRING);
+    atom.string = (char *) key;
+    idx = ovsdb_datum_find_key(datum, &atom, OVSDB_TYPE_STRING);
+    return idx == UINT_MAX ? NULL : datum->values[idx].string;
 }
 
 static const char *
 bridge_get_other_config(const struct ovsrec_bridge *br_cfg, const char *key)
 {
-    return get_ovsrec_key_value(key,
-                                br_cfg->key_other_config,
-                                br_cfg->value_other_config,
-                                br_cfg->n_other_config);
+    return get_ovsrec_key_value(&br_cfg->header_,
+                                &ovsrec_bridge_col_other_config, key);
 }
 
 static void
@@ -3148,10 +3148,10 @@ static const char *
 get_port_other_config(const struct ovsrec_port *port, const char *key,
                       const char *default_value)
 {
-    const char *value = get_ovsrec_key_value(key,
-                                             port->key_other_config,
-                                             port->value_other_config,
-                                             port->n_other_config);
+    const char *value;
+
+    value = get_ovsrec_key_value(&port->header_, &ovsrec_port_col_other_config,
+                                 key);
     return value ? value : default_value;
 }
 
-- 
1.7.1





More information about the dev mailing list