I think you neglected to publish the patch[s] before this one that add sset.
Ethan On Fri, Mar 25, 2011 at 3:40 PM, Ben Pfaff <b...@nicira.com> wrote: > In each of the cases converted here, an shash was used simply to maintain > a set of strings, with the shash_nodes' 'data' values set to NULL. This > commit converts them to use sset instead. > --- > lib/dpif-linux.c | 18 +++++----- > lib/fatal-signal.c | 24 ++++++-------- > lib/netdev.c | 21 +++++------- > ofproto/ofproto.c | 17 +++++----- > ovsdb/ovsdb-server.c | 34 ++++++++++----------- > utilities/ovs-vsctl.c | 31 ++++++++++--------- > vswitchd/bridge.c | 80 ++++++++++++++++++++++++------------------------ > 7 files changed, 109 insertions(+), 116 deletions(-) > > diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c > index 509174c..3c22b55 100644 > --- a/lib/dpif-linux.c > +++ b/lib/dpif-linux.c > @@ -45,6 +45,7 @@ > #include "rtnetlink.h" > #include "rtnetlink-link.h" > #include "shash.h" > +#include "sset.h" > #include "svec.h" > #include "unaligned.h" > #include "util.h" > @@ -125,7 +126,7 @@ struct dpif_linux { > unsigned int listen_mask; > > /* Change notification. */ > - struct shash changed_ports; /* Ports that have changed. */ > + struct sset changed_ports; /* Ports that have changed. */ > struct rtnetlink_notifier port_notifier; > bool change_error; > }; > @@ -231,7 +232,7 @@ open_dpif(const struct dpif_linux_dp *dp, struct dpif > **dpifp) > } > dpif->listen_mask = 0; > dpif->dp_ifindex = dp->dp_ifindex; > - shash_init(&dpif->changed_ports); > + sset_init(&dpif->changed_ports); > dpif->change_error = false; > *dpifp = &dpif->dpif; > > @@ -247,7 +248,7 @@ dpif_linux_close(struct dpif *dpif_) > { > struct dpif_linux *dpif = dpif_linux_cast(dpif_); > rtnetlink_link_notifier_unregister(&dpif->port_notifier); > - shash_destroy(&dpif->changed_ports); > + sset_destroy(&dpif->changed_ports); > free(dpif); > } > > @@ -483,11 +484,10 @@ dpif_linux_port_poll(const struct dpif *dpif_, char > **devnamep) > > if (dpif->change_error) { > dpif->change_error = false; > - shash_clear(&dpif->changed_ports); > + sset_clear(&dpif->changed_ports); > return ENOBUFS; > - } else if (!shash_is_empty(&dpif->changed_ports)) { > - struct shash_node *node = shash_first(&dpif->changed_ports); > - *devnamep = shash_steal(&dpif->changed_ports, node); > + } else if (!sset_is_empty(&dpif->changed_ports)) { > + *devnamep = sset_pop(&dpif->changed_ports); > return 0; > } else { > return EAGAIN; > @@ -498,7 +498,7 @@ static void > dpif_linux_port_poll_wait(const struct dpif *dpif_) > { > struct dpif_linux *dpif = dpif_linux_cast(dpif_); > - if (!shash_is_empty(&dpif->changed_ports) || dpif->change_error) { > + if (!sset_is_empty(&dpif->changed_ports) || dpif->change_error) { > poll_immediate_wake(); > } else { > rtnetlink_link_notifier_wait(); > @@ -1041,7 +1041,7 @@ dpif_linux_port_changed(const struct > rtnetlink_link_change *change, > { > /* Our datapath changed, either adding a new port or deleting an > * existing one. */ > - shash_add_once(&dpif->changed_ports, change->ifname, NULL); > + sset_add(&dpif->changed_ports, change->ifname); > } > } else { > dpif->change_error = true; > diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c > index 81f8f28..ed82173 100644 > --- a/lib/fatal-signal.c > +++ b/lib/fatal-signal.c > @@ -1,5 +1,5 @@ > /* > - * Copyright (c) 2008, 2009, 2010 Nicira Networks. > + * Copyright (c) 2008, 2009, 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. > @@ -26,6 +26,7 @@ > #include <unistd.h> > #include "poll-loop.h" > #include "shash.h" > +#include "sset.h" > #include "socket-util.h" > #include "util.h" > #include "vlog.h" > @@ -194,8 +195,8 @@ call_hooks(int sig_nr) > } > } > > -/* Files to delete on exit. (The 'data' member of each node is unused.) */ > -static struct shash files = SHASH_INITIALIZER(&files); > +/* Files to delete on exit. */ > +static struct sset files = SSET_INITIALIZER(&files); > > /* Has a hook function been registered with fatal_signal_add_hook() (and not > * cleared by fatal_signal_fork())? */ > @@ -215,7 +216,7 @@ fatal_signal_add_file_to_unlink(const char *file) > fatal_signal_add_hook(unlink_files, cancel_files, NULL, true); > } > > - shash_add_once(&files, file, NULL); > + sset_add(&files, file); > } > > /* Unregisters 'file' from being unlinked when the program terminates via > @@ -223,12 +224,7 @@ fatal_signal_add_file_to_unlink(const char *file) > void > fatal_signal_remove_file_to_unlink(const char *file) > { > - struct shash_node *node; > - > - node = shash_find(&files, file); > - if (node) { > - shash_delete(&files, node); > - } > + sset_find_and_delete(&files, file); > } > > /* Like fatal_signal_remove_file_to_unlink(), but also unlinks 'file'. > @@ -255,17 +251,17 @@ unlink_files(void *aux OVS_UNUSED) > static void > cancel_files(void *aux OVS_UNUSED) > { > - shash_clear(&files); > + sset_clear(&files); > added_hook = false; > } > > static void > do_unlink_files(void) > { > - struct shash_node *node; > + const char *file; > > - SHASH_FOR_EACH (node, &files) { > - unlink(node->name); > + SSET_FOR_EACH (file, &files) { > + unlink(file); > } > } > > diff --git a/lib/netdev.c b/lib/netdev.c > index f06742a..4254c1a 100644 > --- a/lib/netdev.c > +++ b/lib/netdev.c > @@ -37,6 +37,7 @@ > #include "packets.h" > #include "poll-loop.h" > #include "shash.h" > +#include "sset.h" > #include "svec.h" > #include "vlog.h" > > @@ -1444,7 +1445,7 @@ netdev_notifier_init(struct netdev_notifier *notifier, > struct netdev *netdev, > /* Tracks changes in the status of a set of network devices. */ > struct netdev_monitor { > struct shash polled_netdevs; > - struct shash changed_netdevs; > + struct sset changed_netdevs; > }; > > /* Creates and returns a new structure for monitor changes in the status of > @@ -1454,7 +1455,7 @@ netdev_monitor_create(void) > { > struct netdev_monitor *monitor = xmalloc(sizeof *monitor); > shash_init(&monitor->polled_netdevs); > - shash_init(&monitor->changed_netdevs); > + sset_init(&monitor->changed_netdevs); > return monitor; > } > > @@ -1472,7 +1473,7 @@ netdev_monitor_destroy(struct netdev_monitor *monitor) > } > > shash_destroy(&monitor->polled_netdevs); > - shash_destroy(&monitor->changed_netdevs); > + sset_destroy(&monitor->changed_netdevs); > free(monitor); > } > } > @@ -1482,7 +1483,7 @@ netdev_monitor_cb(struct netdev_notifier *notifier) > { > struct netdev_monitor *monitor = notifier->aux; > const char *name = netdev_get_name(notifier->netdev); > - shash_add_once(&monitor->changed_netdevs, name, NULL); > + sset_add(&monitor->changed_netdevs, name); > } > > /* Attempts to add 'netdev' as a netdev monitored by 'monitor'. Returns 0 if > @@ -1526,10 +1527,7 @@ netdev_monitor_remove(struct netdev_monitor *monitor, > struct netdev *netdev) > shash_delete(&monitor->polled_netdevs, node); > > /* Drop any pending notification. */ > - node = shash_find(&monitor->changed_netdevs, netdev_name); > - if (node) { > - shash_delete(&monitor->changed_netdevs, node); > - } > + sset_find_and_delete(&monitor->changed_netdevs, netdev_name); > } > } > > @@ -1543,12 +1541,11 @@ netdev_monitor_remove(struct netdev_monitor *monitor, > struct netdev *netdev) > int > netdev_monitor_poll(struct netdev_monitor *monitor, char **devnamep) > { > - struct shash_node *node = shash_first(&monitor->changed_netdevs); > - if (!node) { > + if (sset_is_empty(&monitor->changed_netdevs)) { > *devnamep = NULL; > return EAGAIN; > } else { > - *devnamep = shash_steal(&monitor->changed_netdevs, node); > + *devnamep = sset_pop(&monitor->changed_netdevs); > return 0; > } > } > @@ -1559,7 +1556,7 @@ netdev_monitor_poll(struct netdev_monitor *monitor, > char **devnamep) > void > netdev_monitor_poll_wait(const struct netdev_monitor *monitor) > { > - if (!shash_is_empty(&monitor->changed_netdevs)) { > + if (!sset_is_empty(&monitor->changed_netdevs)) { > poll_immediate_wake(); > } else { > /* XXX Nothing needed here for netdev_linux, but maybe other netdev > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c > index e0715b9..5412f8e 100644 > --- a/ofproto/ofproto.c > +++ b/ofproto/ofproto.c > @@ -54,6 +54,7 @@ > #include "poll-loop.h" > #include "rconn.h" > #include "shash.h" > +#include "sset.h" > #include "stream-ssl.h" > #include "svec.h" > #include "tag.h" > @@ -1578,25 +1579,25 @@ static void > reinit_ports(struct ofproto *p) > { > struct dpif_port_dump dump; > - struct shash_node *node; > - struct shash devnames; > + struct sset devnames; > struct ofport *ofport; > struct dpif_port dpif_port; > + const char *devname; > > COVERAGE_INC(ofproto_reinit_ports); > > - shash_init(&devnames); > + sset_init(&devnames); > HMAP_FOR_EACH (ofport, hmap_node, &p->ports) { > - shash_add_once (&devnames, ofport->opp.name, NULL); > + sset_add(&devnames, ofport->opp.name); > } > DPIF_PORT_FOR_EACH (&dpif_port, &dump, p->dpif) { > - shash_add_once (&devnames, dpif_port.name, NULL); > + sset_add(&devnames, dpif_port.name); > } > > - SHASH_FOR_EACH (node, &devnames) { > - update_port(p, node->name); > + SSET_FOR_EACH (devname, &devnames) { > + update_port(p, devname); > } > - shash_destroy(&devnames); > + sset_destroy(&devnames); > } > > static struct ofport * > diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c > index 8d44d84..df0bc95 100644 > --- a/ovsdb/ovsdb-server.c > +++ b/ovsdb/ovsdb-server.c > @@ -40,7 +40,7 @@ > #include "stream-ssl.h" > #include "stream.h" > #include "stress.h" > -#include "svec.h" > +#include "sset.h" > #include "table.h" > #include "timeval.h" > #include "transaction.h" > @@ -64,15 +64,15 @@ static unixctl_cb_func ovsdb_server_compact; > static unixctl_cb_func ovsdb_server_reconnect; > > static void parse_options(int argc, char *argv[], char **file_namep, > - struct shash *remotes, char **unixctl_pathp, > + struct sset *remotes, char **unixctl_pathp, > char **run_command); > static void usage(void) NO_RETURN; > > static void reconfigure_from_db(struct ovsdb_jsonrpc_server *jsonrpc, > - const struct ovsdb *db, struct shash > *remotes); > + const struct ovsdb *db, struct sset > *remotes); > > static void update_remote_status(const struct ovsdb_jsonrpc_server *jsonrpc, > - const struct shash *remotes, > + const struct sset *remotes, > struct ovsdb *db); > > int > @@ -82,7 +82,7 @@ main(int argc, char *argv[]) > char *run_command = NULL; > struct unixctl_server *unixctl; > struct ovsdb_jsonrpc_server *jsonrpc; > - struct shash remotes; > + struct sset remotes; > struct ovsdb_error *error; > struct ovsdb_file *file; > struct ovsdb *db; > @@ -171,7 +171,7 @@ main(int argc, char *argv[]) > } > ovsdb_jsonrpc_server_destroy(jsonrpc); > ovsdb_destroy(db); > - shash_destroy_free_data(&remotes); > + sset_destroy(&remotes); > unixctl_server_destroy(unixctl); > > if (run_process && process_exited(run_process)) { > @@ -551,14 +551,14 @@ update_remote_rows(const struct ovsdb *db, struct > ovsdb_txn *txn, > > static void > update_remote_status(const struct ovsdb_jsonrpc_server *jsonrpc, > - const struct shash *remotes, struct ovsdb *db) > + const struct sset *remotes, struct ovsdb *db) > { > static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); > - struct shash_node *remote; > struct shash statuses; > struct ovsdb_txn *txn; > const bool durable_txn = false; > struct ovsdb_error *error; > + const char *remote; > > /* Get status of current connections. */ > ovsdb_jsonrpc_server_get_remote_status(jsonrpc, &statuses); > @@ -566,8 +566,8 @@ update_remote_status(const struct ovsdb_jsonrpc_server > *jsonrpc, > txn = ovsdb_txn_create(db); > > /* Iterate over --remote arguments given on command line. */ > - SHASH_FOR_EACH (remote, remotes) { > - update_remote_rows(db, txn, remote->name, &statuses); > + SSET_FOR_EACH (remote, remotes) { > + update_remote_rows(db, txn, remote, &statuses); > } > > error = ovsdb_txn_commit(txn, durable_txn); > @@ -582,16 +582,14 @@ update_remote_status(const struct ovsdb_jsonrpc_server > *jsonrpc, > /* Reconfigures ovsdb-server based on information in the database. */ > static void > reconfigure_from_db(struct ovsdb_jsonrpc_server *jsonrpc, > - const struct ovsdb *db, struct shash *remotes) > + const struct ovsdb *db, struct sset *remotes) > { > struct shash resolved_remotes; > - struct shash_node *node; > + const char *name; > > /* Configure remotes. */ > shash_init(&resolved_remotes); > - SHASH_FOR_EACH (node, remotes) { > - const char *name = node->name; > - > + SSET_FOR_EACH (name, remotes) { > if (!strncmp(name, "db:", 3)) { > query_db_remotes(name, db, &resolved_remotes); > } else { > @@ -652,7 +650,7 @@ ovsdb_server_reconnect(struct unixctl_conn *conn, const > char *args OVS_UNUSED, > > static void > parse_options(int argc, char *argv[], char **file_namep, > - struct shash *remotes, char **unixctl_pathp, > + struct sset *remotes, char **unixctl_pathp, > char **run_command) > { > enum { > @@ -684,7 +682,7 @@ parse_options(int argc, char *argv[], char **file_namep, > }; > char *short_options = long_options_to_short_options(long_options); > > - shash_init(remotes); > + sset_init(remotes); > for (;;) { > int c; > > @@ -695,7 +693,7 @@ parse_options(int argc, char *argv[], char **file_namep, > > switch (c) { > case OPT_REMOTE: > - shash_add_once(remotes, optarg, NULL); > + sset_add(remotes, optarg); > break; > > case OPT_UNIXCTL: > diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c > index 2baab00..fc410f8 100644 > --- a/utilities/ovs-vsctl.c > +++ b/utilities/ovs-vsctl.c > @@ -38,6 +38,7 @@ > #include "process.h" > #include "stream.h" > #include "stream-ssl.h" > +#include "sset.h" > #include "svec.h" > #include "vswitchd/vswitch-idl.h" > #include "table.h" > @@ -757,7 +758,7 @@ static void > get_info(struct vsctl_context *ctx, struct vsctl_info *info) > { > const struct ovsrec_open_vswitch *ovs = ctx->ovs; > - struct shash bridges, ports; > + struct sset bridges, ports; > size_t i; > > info->ctx = ctx; > @@ -765,14 +766,14 @@ get_info(struct vsctl_context *ctx, struct vsctl_info > *info) > shash_init(&info->ports); > shash_init(&info->ifaces); > > - shash_init(&bridges); > - shash_init(&ports); > + sset_init(&bridges); > + sset_init(&ports); > for (i = 0; i < ovs->n_bridges; i++) { > struct ovsrec_bridge *br_cfg = ovs->bridges[i]; > struct vsctl_bridge *br; > size_t j; > > - if (!shash_add_once(&bridges, br_cfg->name, NULL)) { > + if (!sset_add(&bridges, br_cfg->name)) { > VLOG_WARN("%s: database contains duplicate bridge name", > br_cfg->name); > continue; > @@ -785,29 +786,29 @@ get_info(struct vsctl_context *ctx, struct vsctl_info > *info) > for (j = 0; j < br_cfg->n_ports; j++) { > struct ovsrec_port *port_cfg = br_cfg->ports[j]; > > - if (!shash_add_once(&ports, port_cfg->name, NULL)) { > + if (!sset_add(&ports, port_cfg->name)) { > VLOG_WARN("%s: database contains duplicate port name", > port_cfg->name); > continue; > } > > if (port_is_fake_bridge(port_cfg) > - && shash_add_once(&bridges, port_cfg->name, NULL)) { > + && sset_add(&bridges, port_cfg->name)) { > add_bridge(info, NULL, port_cfg->name, br, *port_cfg->tag); > } > } > } > - shash_destroy(&bridges); > - shash_destroy(&ports); > + sset_destroy(&bridges); > + sset_destroy(&ports); > > - shash_init(&bridges); > - shash_init(&ports); > + sset_init(&bridges); > + sset_init(&ports); > for (i = 0; i < ovs->n_bridges; i++) { > struct ovsrec_bridge *br_cfg = ovs->bridges[i]; > struct vsctl_bridge *br; > size_t j; > > - if (!shash_add_once(&bridges, br_cfg->name, NULL)) { > + if (!sset_add(&bridges, br_cfg->name)) { > continue; > } > br = shash_find_data(&info->bridges, br_cfg->name); > @@ -816,12 +817,12 @@ get_info(struct vsctl_context *ctx, struct vsctl_info > *info) > struct vsctl_port *port; > size_t k; > > - if (!shash_add_once(&ports, port_cfg->name, NULL)) { > + if (!sset_add(&ports, port_cfg->name)) { > continue; > } > > if (port_is_fake_bridge(port_cfg) > - && !shash_add_once(&bridges, port_cfg->name, NULL)) { > + && !sset_add(&bridges, port_cfg->name)) { > continue; > } > > @@ -855,8 +856,8 @@ get_info(struct vsctl_context *ctx, struct vsctl_info > *info) > } > } > } > - shash_destroy(&bridges); > - shash_destroy(&ports); > + sset_destroy(&bridges); > + sset_destroy(&ports); > } > > static void > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > index b57860f..b071ec7 100644 > --- a/vswitchd/bridge.c > +++ b/vswitchd/bridge.c > @@ -61,6 +61,7 @@ > #include "shash.h" > #include "socket-util.h" > #include "stream-ssl.h" > +#include "sset.h" > #include "svec.h" > #include "system-stats.h" > #include "timeval.h" > @@ -142,8 +143,8 @@ struct mirror { > struct uuid uuid; /* UUID of this "mirror" record in database. > */ > > /* Selection criteria. */ > - struct shash src_ports; /* Name is port name; data is always NULL. */ > - struct shash dst_ports; /* Name is port name; data is always NULL. */ > + struct sset src_ports; /* Source port names. */ > + struct sset dst_ports; /* Destination port names. */ > int *vlans; > size_t n_vlans; > > @@ -499,30 +500,29 @@ collect_in_band_managers(const struct > ovsrec_open_vswitch *ovs_cfg, > { > struct sockaddr_in *managers = NULL; > size_t n_managers = 0; > - struct shash targets; > + struct sset targets; > size_t i; > > /* Collect all of the potential targets from the "targets" columns of the > * rows pointed to by "manager_options", excluding any that are > * out-of-band. */ > - shash_init(&targets); > + sset_init(&targets); > for (i = 0; i < ovs_cfg->n_manager_options; i++) { > struct ovsrec_manager *m = ovs_cfg->manager_options[i]; > > if (m->connection_mode && !strcmp(m->connection_mode, "out-of-band")) > { > - shash_find_and_delete(&targets, m->target); > + sset_find_and_delete(&targets, m->target); > } else { > - shash_add_once(&targets, m->target, NULL); > + sset_add(&targets, m->target); > } > } > > /* Now extract the targets' IP addresses. */ > - if (!shash_is_empty(&targets)) { > - struct shash_node *node; > + if (!sset_is_empty(&targets)) { > + const char *target; > > - managers = xmalloc(shash_count(&targets) * sizeof *managers); > - SHASH_FOR_EACH (node, &targets) { > - const char *target = node->name; > + managers = xmalloc(sset_count(&targets) * sizeof *managers); > + SSET_FOR_EACH (target, &targets) { > struct sockaddr_in *sin = &managers[n_managers]; > > if ((!strncmp(target, "tcp:", 4) > @@ -533,7 +533,7 @@ collect_in_band_managers(const struct ovsrec_open_vswitch > *ovs_cfg, > } > } > } > - shash_destroy(&targets); > + sset_destroy(&targets); > > *managersp = managers; > *n_managersp = n_managers; > @@ -3928,24 +3928,24 @@ static void > port_del_ifaces(struct port *port, const struct ovsrec_port *cfg) > { > struct iface *iface, *next; > - struct shash new_ifaces; > + struct sset new_ifaces; > size_t i; > > /* Collect list of new interfaces. */ > - shash_init(&new_ifaces); > + sset_init(&new_ifaces); > for (i = 0; i < cfg->n_interfaces; i++) { > const char *name = cfg->interfaces[i]->name; > - shash_add_once(&new_ifaces, name, NULL); > + sset_add(&new_ifaces, name); > } > > /* Get rid of deleted interfaces. */ > LIST_FOR_EACH_SAFE (iface, next, port_elem, &port->ifaces) { > - if (!shash_find(&new_ifaces, iface->name)) { > + if (!sset_contains(&new_ifaces, iface->name)) { > iface_destroy(iface); > } > } > > - shash_destroy(&new_ifaces); > + sset_destroy(&new_ifaces); > } > > /* Expires all MAC learning entries associated with 'port' and forces ofproto > @@ -3969,7 +3969,7 @@ static void > port_reconfigure(struct port *port, const struct ovsrec_port *cfg) > { > const char *detect_mode; > - struct shash new_ifaces; > + struct sset new_ifaces; > long long int next_rebalance, miimon_next_update, lacp_priority; > bool need_flush = false; > unsigned long *trunks; > @@ -4037,12 +4037,12 @@ port_reconfigure(struct port *port, const struct > ovsrec_port *cfg) > } > > /* Add new interfaces and update 'cfg' member of existing ones. */ > - shash_init(&new_ifaces); > + sset_init(&new_ifaces); > for (i = 0; i < cfg->n_interfaces; i++) { > const struct ovsrec_interface *if_cfg = cfg->interfaces[i]; > struct iface *iface; > > - if (!shash_add_once(&new_ifaces, if_cfg->name, NULL)) { > + if (!sset_add(&new_ifaces, if_cfg->name)) { > VLOG_WARN("port %s: %s specified twice as port interface", > port->name, if_cfg->name); > iface_set_ofport(if_cfg, -1); > @@ -4079,7 +4079,7 @@ port_reconfigure(struct port *port, const struct > ovsrec_port *cfg) > iface->lacp_priority = lacp_priority; > } > } > - shash_destroy(&new_ifaces); > + sset_destroy(&new_ifaces); > > port->lacp_fast = !strcmp(get_port_other_config(cfg, "lacp-time", "slow"), > "fast"); > @@ -4734,8 +4734,8 @@ mirror_create(struct bridge *br, struct ovsrec_mirror > *cfg) > m->bridge = br; > m->idx = i; > m->name = xstrdup(cfg->name); > - shash_init(&m->src_ports); > - shash_init(&m->dst_ports); > + sset_init(&m->src_ports); > + sset_init(&m->dst_ports); > m->vlans = NULL; > m->n_vlans = 0; > m->out_vlan = -1; > @@ -4756,8 +4756,8 @@ mirror_destroy(struct mirror *m) > port->dst_mirrors &= ~(MIRROR_MASK_C(1) << m->idx); > } > > - shash_destroy(&m->src_ports); > - shash_destroy(&m->dst_ports); > + sset_destroy(&m->src_ports); > + sset_destroy(&m->dst_ports); > free(m->vlans); > > m->bridge->mirrors[m->idx] = NULL; > @@ -4771,14 +4771,14 @@ mirror_destroy(struct mirror *m) > > static void > mirror_collect_ports(struct mirror *m, struct ovsrec_port **ports, int > n_ports, > - struct shash *names) > + struct sset *names) > { > size_t i; > > for (i = 0; i < n_ports; i++) { > const char *name = ports[i]->name; > if (port_lookup(m->bridge, name)) { > - shash_add_once(names, name, NULL); > + sset_add(names, name); > } else { > VLOG_WARN("bridge %s: mirror %s cannot match on nonexistent " > "port %s", m->bridge->name, m->name, name); > @@ -4836,7 +4836,7 @@ port_trunks_any_mirrored_vlan(const struct mirror *m, > const struct port *p) > static void > mirror_reconfigure_one(struct mirror *m, struct ovsrec_mirror *cfg) > { > - struct shash src_ports, dst_ports; > + struct sset src_ports, dst_ports; > mirror_mask_t mirror_bit; > struct port *out_port; > struct port *port; > @@ -4876,12 +4876,12 @@ mirror_reconfigure_one(struct mirror *m, struct > ovsrec_mirror *cfg) > return; > } > > - shash_init(&src_ports); > - shash_init(&dst_ports); > + sset_init(&src_ports); > + sset_init(&dst_ports); > if (cfg->select_all) { > HMAP_FOR_EACH (port, hmap_node, &m->bridge->ports) { > - shash_add_once(&src_ports, port->name, NULL); > - shash_add_once(&dst_ports, port->name, NULL); > + sset_add(&src_ports, port->name); > + sset_add(&dst_ports, port->name); > } > vlans = NULL; > n_vlans = 0; > @@ -4897,8 +4897,8 @@ mirror_reconfigure_one(struct mirror *m, struct > ovsrec_mirror *cfg) > } > > /* Update mirror data. */ > - if (!shash_equal_keys(&m->src_ports, &src_ports) > - || !shash_equal_keys(&m->dst_ports, &dst_ports) > + if (!sset_equals(&m->src_ports, &src_ports) > + || !sset_equals(&m->dst_ports, &dst_ports) > || m->n_vlans != n_vlans > || memcmp(m->vlans, vlans, sizeof *vlans * n_vlans) > || m->out_port != out_port > @@ -4906,8 +4906,8 @@ mirror_reconfigure_one(struct mirror *m, struct > ovsrec_mirror *cfg) > bridge_flush(m->bridge); > mac_learning_flush(m->bridge->ml); > } > - shash_swap(&m->src_ports, &src_ports); > - shash_swap(&m->dst_ports, &dst_ports); > + sset_swap(&m->src_ports, &src_ports); > + sset_swap(&m->dst_ports, &dst_ports); > free(m->vlans); > m->vlans = vlans; > m->n_vlans = n_vlans; > @@ -4917,7 +4917,7 @@ mirror_reconfigure_one(struct mirror *m, struct > ovsrec_mirror *cfg) > /* Update ports. */ > mirror_bit = MIRROR_MASK_C(1) << m->idx; > HMAP_FOR_EACH (port, hmap_node, &m->bridge->ports) { > - if (shash_find(&m->src_ports, port->name) > + if (sset_contains(&m->src_ports, port->name) > || (m->n_vlans > && (!port->vlan > ? port_trunks_any_mirrored_vlan(m, port) > @@ -4927,7 +4927,7 @@ mirror_reconfigure_one(struct mirror *m, struct > ovsrec_mirror *cfg) > port->src_mirrors &= ~mirror_bit; > } > > - if (shash_find(&m->dst_ports, port->name)) { > + if (sset_contains(&m->dst_ports, port->name)) { > port->dst_mirrors |= mirror_bit; > } else { > port->dst_mirrors &= ~mirror_bit; > @@ -4935,6 +4935,6 @@ mirror_reconfigure_one(struct mirror *m, struct > ovsrec_mirror *cfg) > } > > /* Clean up. */ > - shash_destroy(&src_ports); > - shash_destroy(&dst_ports); > + sset_destroy(&src_ports); > + sset_destroy(&dst_ports); > } > -- > 1.7.1 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev