diff options
author | Thomas Haller <thaller@redhat.com> | 2017-07-04 09:57:06 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-07-05 18:37:39 +0200 |
commit | aeaa1b3b98d0728d9b220a8d16eaa017a2bfa8b4 (patch) | |
tree | 481da5beee45203bbbcd46a10441af35893e36e1 | |
parent | cfd1851c0067773211524c2b648330b6ee7a066c (diff) | |
download | NetworkManager-aeaa1b3b98d0728d9b220a8d16eaa017a2bfa8b4.tar.gz |
platform: refactor nm_dedup_multi_objs_to_ptr_array_head()
by moving the core functionality to "nm-dedup-multi.c".
As the ref-counting mechanism now is part of "nm-dedup-multi.c",
this works better and is reusable outside of platform.
-rw-r--r-- | shared/nm-utils/nm-dedup-multi.c | 28 | ||||
-rw-r--r-- | shared/nm-utils/nm-dedup-multi.h | 14 | ||||
-rw-r--r-- | src/platform/nm-platform.c | 26 |
3 files changed, 45 insertions, 23 deletions
diff --git a/shared/nm-utils/nm-dedup-multi.c b/shared/nm-utils/nm-dedup-multi.c index 6a276ae4f1..92dba89936 100644 --- a/shared/nm-utils/nm-dedup-multi.c +++ b/shared/nm-utils/nm-dedup-multi.c @@ -931,6 +931,34 @@ nm_dedup_multi_obj_clone (const NMDedupMultiObj *obj) return o; } +GPtrArray * +nm_dedup_multi_objs_to_ptr_array_head (const NMDedupMultiHeadEntry *head_entry, + NMDedupMultiFcnSelectPredicate predicate, + gpointer user_data) +{ + GPtrArray *result; + NMDedupMultiIter iter; + + if (!head_entry) + return NULL; + + result = g_ptr_array_new_full (head_entry->len, + (GDestroyNotify) nm_dedup_multi_obj_unref); + nm_dedup_multi_iter_for_each (&iter, head_entry) { + const NMDedupMultiObj *obj = iter.current->obj; + + if ( !predicate + || predicate (obj, user_data)) + g_ptr_array_add (result, (gpointer) nm_dedup_multi_obj_ref (obj)); + } + + if (result->len == 0) { + g_ptr_array_unref (result); + return NULL; + } + return result; +} + /*****************************************************************************/ NMDedupMultiIndex * diff --git a/shared/nm-utils/nm-dedup-multi.h b/shared/nm-utils/nm-dedup-multi.h index 090cc743a0..77a2fd122d 100644 --- a/shared/nm-utils/nm-dedup-multi.h +++ b/shared/nm-utils/nm-dedup-multi.h @@ -360,6 +360,20 @@ nm_dedup_multi_iter_rewind (NMDedupMultiIter *iter) nm_dedup_multi_iter_init (iter, iter->head); } +#define nm_dedup_multi_iter_for_each(iter, head_entry) \ + for (nm_dedup_multi_iter_init ((iter), (head_entry)); \ + nm_dedup_multi_iter_next ((iter)); \ + ) + +/*****************************************************************************/ + +typedef gboolean (*NMDedupMultiFcnSelectPredicate) (/* const NMDedupMultiObj * */ gconstpointer obj, + gpointer user_data); + +GPtrArray *nm_dedup_multi_objs_to_ptr_array_head (const NMDedupMultiHeadEntry *head_entry, + NMDedupMultiFcnSelectPredicate predicate, + gpointer user_data); + /*****************************************************************************/ #endif /* __NM_DEDUP_MULTI_H__ */ diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index c8008216b2..de5ac3cf40 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -2692,29 +2692,9 @@ nm_platform_lookup_clone (NMPlatform *platform, gboolean (*predicate) (const NMPObject *obj, gpointer user_data), gpointer user_data) { - const NMDedupMultiHeadEntry *head_entry; - GPtrArray *result; - NMDedupMultiIter iter; - const NMPObject *plobj = NULL; - - head_entry = nm_platform_lookup (platform, lookup); - if (!head_entry) - return NULL; - - result = g_ptr_array_new_full (head_entry->len, - (GDestroyNotify) nmp_object_unref); - nmp_cache_iter_for_each (&iter, head_entry, &plobj) { - if ( predicate - && !predicate (plobj, user_data)) - continue; - g_ptr_array_add (result, (gpointer) nmp_object_ref (plobj)); - } - - if (result->len == 0) { - g_ptr_array_unref (result); - return NULL; - } - return result; + return nm_dedup_multi_objs_to_ptr_array_head (nm_platform_lookup (platform, lookup), + (NMDedupMultiFcnSelectPredicate) predicate, + user_data); } void |