summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-08-03 19:24:12 +0200
committerThomas Haller <thaller@redhat.com>2019-08-08 10:07:15 +0200
commitdda32892069ac31f599126ab0f51bfacb3a2e4d1 (patch)
treebc61d73700afbbcd8182be82183d4f8eb6632428
parentb80b25050fe0c78b581b713c28280fc91c53fc09 (diff)
downloadNetworkManager-dda32892069ac31f599126ab0f51bfacb3a2e4d1.tar.gz
shared: add nm_c_list_elem_find_first() helper macro
- add nm_c_list_elem_find_first() macro that takes a predicate and returns the first match. This macro has a non-function-like behavior, which we often try to avoid because macros should behave like functions. In this case it's however convenient, so let's do it. Also, despite being non-function-like, it should be pretty hard to use wrongly. - rename nm_c_list_elem_find_first() to nm_c_list_elem_find_first_ptr().
-rw-r--r--shared/nm-glib-aux/nm-c-list.h29
-rw-r--r--src/nm-manager.c2
2 files changed, 21 insertions, 10 deletions
diff --git a/shared/nm-glib-aux/nm-c-list.h b/shared/nm-glib-aux/nm-c-list.h
index 7512730d81..07c526dcb0 100644
--- a/shared/nm-glib-aux/nm-c-list.h
+++ b/shared/nm-glib-aux/nm-c-list.h
@@ -88,8 +88,25 @@ nm_c_list_elem_free_all (CList *head, GDestroyNotify free_fcn)
nm_c_list_elem_free_full (elem, free_fcn);
}
+#define nm_c_list_elem_find_first(head, arg, predicate) \
+ ({ \
+ CList *const _head = (head); \
+ NMCListElem *_result = NULL; \
+ NMCListElem *_elem; \
+ \
+ c_list_for_each_entry (_elem, _head, lst) { \
+ void *const arg = _elem->data; \
+ \
+ if (predicate) { \
+ _result = _elem; \
+ break; \
+ } \
+ } \
+ _result; \
+ })
+
/**
- * nm_c_list_elem_find_first:
+ * nm_c_list_elem_find_first_ptr:
* @head: the @CList head of a list containing #NMCListElem elements.
* Note that the head is not itself part of the list.
* @needle: the needle pointer.
@@ -100,15 +117,9 @@ nm_c_list_elem_free_all (CList *head, GDestroyNotify free_fcn)
* Returns: the found list element or %NULL if not found.
*/
static inline NMCListElem *
-nm_c_list_elem_find_first (CList *head, gconstpointer needle)
+nm_c_list_elem_find_first_ptr (CList *head, gconstpointer needle)
{
- NMCListElem *elem;
-
- c_list_for_each_entry (elem, head, lst) {
- if (elem->data == needle)
- return elem;
- }
- return NULL;
+ return nm_c_list_elem_find_first (head, x, x == needle);
}
/*****************************************************************************/
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 64cdb9aed2..311bb68dd9 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -2134,7 +2134,7 @@ connection_changed_on_idle (NMManager *self,
if (priv->connection_changed_on_idle_id == 0)
priv->connection_changed_on_idle_id = g_idle_add (connection_changed_on_idle_cb, self);
- if (!nm_c_list_elem_find_first (&priv->connection_changed_on_idle_lst, sett_conn)) {
+ if (!nm_c_list_elem_find_first_ptr (&priv->connection_changed_on_idle_lst, sett_conn)) {
c_list_link_tail (&priv->connection_changed_on_idle_lst,
&nm_c_list_elem_new_stale (g_object_ref (sett_conn))->lst);
}