The interface will be more similar to the cmap. Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> --- lib/hmap.c | 26 ++++++++++++-------------- lib/hmap.h | 7 ++++++- lib/sset.c | 12 +++++------- lib/sset.h | 7 ++++++- ofproto/ofproto-dpif.c | 8 +++----- 5 files changed, 32 insertions(+), 28 deletions(-)
diff --git a/lib/hmap.c b/lib/hmap.c index b70ce51..9462c5e 100644 --- a/lib/hmap.c +++ b/lib/hmap.c @@ -236,24 +236,22 @@ hmap_random_node(const struct hmap *hmap) } /* Returns the next node in 'hmap' in hash order, or NULL if no nodes remain in - * 'hmap'. Uses '*bucketp' and '*offsetp' to determine where to begin - * iteration, and stores new values to pass on the next iteration into them - * before returning. + * 'hmap'. Uses '*pos' to determine where to begin iteration, and updates + * '*pos' to pass on the next iteration into them before returning. * * It's better to use plain HMAP_FOR_EACH and related functions, since they are * faster and better at dealing with hmaps that change during iteration. * - * Before beginning iteration, store 0 into '*bucketp' and '*offsetp'. - */ + * Before beginning iteration, set '*pos' to all zeros. */ struct hmap_node * hmap_at_position(const struct hmap *hmap, - uint32_t *bucketp, uint32_t *offsetp) + struct hmap_position *pos) { size_t offset; size_t b_idx; - offset = *offsetp; - for (b_idx = *bucketp; b_idx <= hmap->mask; b_idx++) { + offset = pos->offset; + for (b_idx = pos->bucket; b_idx <= hmap->mask; b_idx++) { struct hmap_node *node; size_t n_idx; @@ -261,11 +259,11 @@ hmap_at_position(const struct hmap *hmap, n_idx++, node = node->next) { if (n_idx == offset) { if (node->next) { - *bucketp = node->hash & hmap->mask; - *offsetp = offset + 1; + pos->bucket = node->hash & hmap->mask; + pos->offset = offset + 1; } else { - *bucketp = (node->hash & hmap->mask) + 1; - *offsetp = 0; + pos->bucket = (node->hash & hmap->mask) + 1; + pos->offset = 0; } return node; } @@ -273,8 +271,8 @@ hmap_at_position(const struct hmap *hmap, offset = 0; } - *bucketp = 0; - *offsetp = 0; + pos->bucket = 0; + pos->offset = 0; return NULL; } diff --git a/lib/hmap.h b/lib/hmap.h index 08c4719..9a96c5f 100644 --- a/lib/hmap.h +++ b/lib/hmap.h @@ -201,8 +201,13 @@ static inline struct hmap_node *hmap_first(const struct hmap *); static inline struct hmap_node *hmap_next(const struct hmap *, const struct hmap_node *); +struct hmap_position { + unsigned int bucket; + unsigned int offset; +}; + struct hmap_node *hmap_at_position(const struct hmap *, - uint32_t *bucket, uint32_t *offset); + struct hmap_position *); /* Returns the number of nodes currently in 'hmap'. */ static inline size_t diff --git a/lib/sset.c b/lib/sset.c index f9d4fc0..4fd3fae 100644 --- a/lib/sset.c +++ b/lib/sset.c @@ -251,21 +251,19 @@ sset_equals(const struct sset *a, const struct sset *b) } /* Returns the next node in 'set' in hash order, or NULL if no nodes remain in - * 'set'. Uses '*bucketp' and '*offsetp' to determine where to begin - * iteration, and stores new values to pass on the next iteration into them - * before returning. + * 'set'. Uses '*pos' to determine where to begin iteration, and updates + * '*pos' to pass on the next iteration into them before returning. * * It's better to use plain SSET_FOR_EACH and related functions, since they are * faster and better at dealing with ssets that change during iteration. * - * Before beginning iteration, store 0 into '*bucketp' and '*offsetp'. - */ + * Before beginning iteration, set '*pos' to all zeros. */ struct sset_node * -sset_at_position(const struct sset *set, uint32_t *bucketp, uint32_t *offsetp) +sset_at_position(const struct sset *set, struct sset_position *pos) { struct hmap_node *hmap_node; - hmap_node = hmap_at_position(&set->map, bucketp, offsetp); + hmap_node = hmap_at_position(&set->map, &pos->pos); return SSET_NODE_FROM_HMAP_NODE(hmap_node); } diff --git a/lib/sset.h b/lib/sset.h index 7d1d496..9c2f703 100644 --- a/lib/sset.h +++ b/lib/sset.h @@ -64,8 +64,13 @@ char *sset_pop(struct sset *); struct sset_node *sset_find(const struct sset *, const char *); bool sset_contains(const struct sset *, const char *); bool sset_equals(const struct sset *, const struct sset *); + +struct sset_position { + struct hmap_position pos; +}; + struct sset_node *sset_at_position(const struct sset *, - uint32_t *bucketp, uint32_t *offsetp); + struct sset_position *); /* Set operations. */ void sset_intersect(struct sset *, const struct sset *); diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 285e377..747482c 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -3556,8 +3556,7 @@ port_get_lacp_stats(const struct ofport *ofport_, struct lacp_slave_stats *stats } struct port_dump_state { - uint32_t bucket; - uint32_t offset; + struct sset_position pos; bool ghost; struct ofproto_port port; @@ -3585,7 +3584,7 @@ port_dump_next(const struct ofproto *ofproto_, void *state_, state->has_port = false; } sset = state->ghost ? &ofproto->ghost_ports : &ofproto->ports; - while ((node = sset_at_position(sset, &state->bucket, &state->offset))) { + while ((node = sset_at_position(sset, &state->pos))) { int error; error = port_query_by_name(ofproto_, node->name, &state->port); @@ -3600,8 +3599,7 @@ port_dump_next(const struct ofproto *ofproto_, void *state_, if (!state->ghost) { state->ghost = true; - state->bucket = 0; - state->offset = 0; + memset(&state->pos, 0, sizeof state->pos); return port_dump_next(ofproto_, state_, port); } -- 2.1.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev