dpif-netdev: Do not log error for EOPNOTSUPP return from netdev_recv().
[openvswitch] / lib / hmap.h
index 04e51bc6d039b83448b576881ff0592b5ea3e83a..674c6c778d2060a835fa98dc47c35db9fca725b3 100644 (file)
@@ -38,6 +38,7 @@ static inline size_t hmap_node_hash(const struct hmap_node *node)
 }
 
 #define HMAP_NODE_NULL ((struct hmap_node *) 1)
+#define HMAP_NODE_NULL_INITIALIZER { 0, HMAP_NODE_NULL }
 
 /* Returns true if 'node' has been set to null by hmap_node_nullify() and has
  * not been un-nullified by being inserted into an hmap. */
@@ -132,17 +133,17 @@ static inline struct hmap_node *hmap_first_in_bucket(const struct hmap *,
                                                      size_t hash);
 static inline struct hmap_node *hmap_next_in_bucket(const struct hmap_node *);
 
-/* Iteration.
- *
- * The _SAFE version is needed when NODE may be freed.  It is not needed when
- * NODE may be removed from the hash map but its members remain accessible and
- * intact. */
+/* Iteration. */
+
+/* Iterates through every node in HMAP. */
 #define HMAP_FOR_EACH(NODE, MEMBER, HMAP)                               \
     for ((NODE) = OBJECT_CONTAINING(hmap_first(HMAP), NODE, MEMBER);    \
          &(NODE)->MEMBER != NULL;                                       \
          (NODE) = OBJECT_CONTAINING(hmap_next(HMAP, &(NODE)->MEMBER),   \
                                     NODE, MEMBER))
 
+/* Safe when NODE may be freed (not needed when NODE may be removed from the
+ * hash map but its members remain accessible and intact). */
 #define HMAP_FOR_EACH_SAFE(NODE, NEXT, MEMBER, HMAP)                    \
     for ((NODE) = OBJECT_CONTAINING(hmap_first(HMAP), NODE, MEMBER);    \
          (&(NODE)->MEMBER != NULL                                       \
@@ -151,6 +152,14 @@ static inline struct hmap_node *hmap_next_in_bucket(const struct hmap_node *);
           : 0);                                                         \
          (NODE) = (NEXT))
 
+/* Continues an iteration from just after NODE. */
+#define HMAP_FOR_EACH_CONTINUE(NODE, MEMBER, HMAP)                      \
+    for ((NODE) = OBJECT_CONTAINING(hmap_next(HMAP, &(NODE)->MEMBER),   \
+                                    NODE, MEMBER);                      \
+         &(NODE)->MEMBER != NULL;                                       \
+         (NODE) = OBJECT_CONTAINING(hmap_next(HMAP, &(NODE)->MEMBER),   \
+                                    NODE, MEMBER))
+
 static inline struct hmap_node *hmap_first(const struct hmap *);
 static inline struct hmap_node *hmap_next(const struct hmap *,
                                           const struct hmap_node *);