summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-07-04 09:57:06 +0200
committerThomas Haller <thaller@redhat.com>2017-07-05 18:37:39 +0200
commitaeaa1b3b98d0728d9b220a8d16eaa017a2bfa8b4 (patch)
tree481da5beee45203bbbcd46a10441af35893e36e1
parentcfd1851c0067773211524c2b648330b6ee7a066c (diff)
downloadNetworkManager-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.c28
-rw-r--r--shared/nm-utils/nm-dedup-multi.h14
-rw-r--r--src/platform/nm-platform.c26
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