>
>Hi Mark,
>
>On 14/04/2016 05:36, "Kavanagh, Mark B" <mark.b.kavan...@intel.com> wrote:
>
>>Hi Daniele,
>>
>>One minor comment inline.
>>
>>Cheers,
>>Mark
>>
>>>
>>>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;
>>>+};
>>
>>[MK] Would a typedef be more appropriate here, as it would avoid the
>>additional layer of dereference?
>
>CodingStyle.md says:
>
>"Use typedefs sparingly.  Code is clearer if the actual type is
>visible at the point of declaration.  Do not, in general, declare a
>typedef for a struct, union, or enum." and I agree :-), so IMHO
>it'd be better to keep it as it is.

Ah yes, I seem to recall reading that some time back.

Apologies for the oversight on my part - consider this patch acked as-is.

Thanks,
Mark

>
>What do you think?
>
>Thanks



>
>>>+
>>> 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 530c49a..aceb11f 100644
>>>--- a/ofproto/ofproto-dpif.c
>>>+++ b/ofproto/ofproto-dpif.c
>>>@@ -3558,8 +3558,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;
>>>@@ -3587,7 +3586,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);
>>>@@ -3602,8 +3601,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

Reply via email to