From 6f0d7c5a653cfc31805bc0d4658fc35130522646 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 16 Jul 2017 19:18:51 +0200 Subject: core: simplify NMDedupMultiIter by storing CList pointer Let next and head pointers point to the CList value, instead of NMDedupMultiEntry. --- shared/nm-utils/nm-dedup-multi.h | 49 +++++++++++----------------------------- src/nm-ip4-config.c | 21 ++++++++--------- src/nm-ip6-config.c | 22 ++++++++---------- 3 files changed, 31 insertions(+), 61 deletions(-) diff --git a/shared/nm-utils/nm-dedup-multi.h b/shared/nm-utils/nm-dedup-multi.h index 8edd021c23..8a649c9413 100644 --- a/shared/nm-utils/nm-dedup-multi.h +++ b/shared/nm-utils/nm-dedup-multi.h @@ -302,9 +302,9 @@ guint nm_dedup_multi_index_dirty_remove_idx (NMDedupMultiIndex *self, /*****************************************************************************/ typedef struct _NMDedupMultiIter { - const NMDedupMultiHeadEntry *head; + const CList *_head; + const CList *_next; const NMDedupMultiEntry *current; - const NMDedupMultiEntry *next; } NMDedupMultiIter; static inline void @@ -312,11 +312,11 @@ nm_dedup_multi_iter_init (NMDedupMultiIter *iter, const NMDedupMultiHeadEntry *h { g_return_if_fail (iter); - iter->head = head; - iter->current = NULL; - iter->next = head && !c_list_is_empty (&head->lst_entries_head) - ? c_list_entry (head->lst_entries_head.next, NMDedupMultiEntry, lst_entries) - : NULL; + if (head && !c_list_is_empty (&head->lst_entries_head)) { + iter->_head = &head->lst_entries_head; + iter->_next = head->lst_entries_head.next; + } else + iter->_next = NULL; } static inline gboolean @@ -324,42 +324,19 @@ nm_dedup_multi_iter_next (NMDedupMultiIter *iter) { g_return_val_if_fail (iter, FALSE); - if (!iter->next) + if (!iter->_next) return FALSE; - /* we always look ahead for the @next. This way, the user + /* we always look ahead for the next. This way, the user * may delete the current entry (but no other entries). */ - iter->current = iter->next; - if (iter->next->lst_entries.next == &iter->head->lst_entries_head) - iter->next = NULL; + iter->current = c_list_entry (iter->_next, NMDedupMultiEntry, lst_entries); + if (iter->_next->next == iter->_head) + iter->_next = NULL; else - iter->next = c_list_entry (iter->next->lst_entries.next, NMDedupMultiEntry, lst_entries); + iter->_next = iter->_next->next; return TRUE; } -static inline void -nm_dedup_multi_iter_rewind (NMDedupMultiIter *iter) -{ - /* rewind the iterator. - * - * In principle, you can always delete the current entry. - * However, if you delete *all* current entries, the list - * head becomes invalid too and rewinding will crash. - * - * So, either - * - don't modify the list - * - if you modify it: - * - only delete the current entry, don't delete other entries. - * - you may add more entries, however that may make iteration - * confusing. - * - you may rewind the iterator, but only if not all - * entires were deleted. - * - * Use with care. */ - g_return_if_fail (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)); \ diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index c02b1caeaf..258d76518b 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -612,7 +612,6 @@ nm_ip4_config_capture (NMDedupMultiIndex *multi_idx, NMPlatform *platform, int i * routes have their route metrics explicitly set. */ priv->route_metric = priv->has_gateway ? (gint64) lowest_metric : (gint64) -1; - nm_dedup_multi_iter_rewind (&iter); nmp_cache_iter_for_each (&iter, head_entry, &plobj) { const NMPlatformIP4Route *route = NMP_OBJECT_CAST_IP4_ROUTE (plobj); @@ -1396,6 +1395,7 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev NMIP4ConfigPrivate *dst_priv; const NMIP4ConfigPrivate *src_priv; NMDedupMultiIter ipconf_iter_src, ipconf_iter_dst; + const NMDedupMultiHeadEntry *head_entry_src; g_return_val_if_fail (src != NULL, FALSE); g_return_val_if_fail (dst != NULL, FALSE); @@ -1438,7 +1438,8 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev } /* addresses */ - nm_ip_config_iter_ip4_address_init (&ipconf_iter_src, src); + head_entry_src = nm_ip4_config_lookup_addresses (src); + nm_dedup_multi_iter_init (&ipconf_iter_src, head_entry_src); nm_ip_config_iter_ip4_address_init (&ipconf_iter_dst, dst); are_equal = TRUE; while (TRUE) { @@ -1464,15 +1465,13 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev } } if (!are_equal) { - const NMPlatformIP4Address *r_src; has_minor_changes = TRUE; nm_dedup_multi_index_dirty_set_idx (dst_priv->multi_idx, &dst_priv->idx_ip4_addresses); - nm_dedup_multi_iter_rewind (&ipconf_iter_src); - while (nm_ip_config_iter_ip4_address_next (&ipconf_iter_src, &r_src)) { + nm_dedup_multi_iter_for_each (&ipconf_iter_src, head_entry_src) { nm_dedup_multi_index_add (dst_priv->multi_idx, &dst_priv->idx_ip4_addresses, - NMP_OBJECT_UP_CAST (r_src), + ipconf_iter_src.current->obj, NM_DEDUP_MULTI_IDX_MODE_APPEND_FORCE, NULL, NULL); @@ -1481,7 +1480,8 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev } /* routes */ - nm_ip_config_iter_ip4_route_init (&ipconf_iter_src, src); + head_entry_src = nm_ip4_config_lookup_routes (src); + nm_dedup_multi_iter_init (&ipconf_iter_src, head_entry_src); nm_ip_config_iter_ip4_route_init (&ipconf_iter_dst, dst); are_equal = TRUE; while (TRUE) { @@ -1506,15 +1506,12 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev } } if (!are_equal) { - const NMPlatformIP4Route *r_src; - has_minor_changes = TRUE; nm_dedup_multi_index_dirty_set_idx (dst_priv->multi_idx, &dst_priv->idx_ip4_routes); - nm_dedup_multi_iter_rewind (&ipconf_iter_src); - while (nm_ip_config_iter_ip4_route_next (&ipconf_iter_src, &r_src)) { + nm_dedup_multi_iter_for_each (&ipconf_iter_src, head_entry_src) { nm_dedup_multi_index_add (dst_priv->multi_idx, &dst_priv->idx_ip4_routes, - NMP_OBJECT_UP_CAST (r_src), + ipconf_iter_src.current->obj, NM_DEDUP_MULTI_IDX_MODE_APPEND_FORCE, NULL, NULL); diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index b24c1ad28c..65ecfdb523 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -462,7 +462,6 @@ nm_ip6_config_capture (NMDedupMultiIndex *multi_idx, NMPlatform *platform, int i * routes have their route metrics explicitly set. */ priv->route_metric = has_gateway ? (gint64) lowest_metric : (gint64) -1; - nm_dedup_multi_iter_rewind (&iter); nmp_cache_iter_for_each (&iter, head_entry, &plobj) { const NMPlatformIP6Route *route = NMP_OBJECT_CAST_IP6_ROUTE (plobj); @@ -1174,6 +1173,7 @@ nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relev NMIP6ConfigPrivate *dst_priv; const NMIP6ConfigPrivate *src_priv; NMDedupMultiIter ipconf_iter_src, ipconf_iter_dst; + const NMDedupMultiHeadEntry *head_entry_src; g_return_val_if_fail (NM_IS_IP6_CONFIG (src), FALSE); g_return_val_if_fail (NM_IS_IP6_CONFIG (dst), FALSE); @@ -1212,7 +1212,8 @@ nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relev } /* addresses */ - nm_ip_config_iter_ip6_address_init (&ipconf_iter_src, src); + head_entry_src = nm_ip6_config_lookup_addresses (src); + nm_dedup_multi_iter_init (&ipconf_iter_src, head_entry_src); nm_ip_config_iter_ip6_address_init (&ipconf_iter_dst, dst); are_equal = TRUE; while (TRUE) { @@ -1240,15 +1241,12 @@ nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relev } } if (!are_equal) { - const NMPlatformIP6Address *r_src; - has_minor_changes = TRUE; nm_dedup_multi_index_dirty_set_idx (dst_priv->multi_idx, &dst_priv->idx_ip6_addresses); - nm_dedup_multi_iter_rewind (&ipconf_iter_src); - while (nm_ip_config_iter_ip6_address_next (&ipconf_iter_src, &r_src)) { + nm_dedup_multi_iter_for_each (&ipconf_iter_src, head_entry_src) { nm_dedup_multi_index_add (dst_priv->multi_idx, &dst_priv->idx_ip6_addresses, - NMP_OBJECT_UP_CAST (r_src), + ipconf_iter_src.current->obj, NM_DEDUP_MULTI_IDX_MODE_APPEND_FORCE, NULL, NULL); @@ -1257,7 +1255,8 @@ nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relev } /* routes */ - nm_ip_config_iter_ip6_route_init (&ipconf_iter_src, src); + head_entry_src = nm_ip6_config_lookup_routes (src); + nm_dedup_multi_iter_init (&ipconf_iter_src, head_entry_src); nm_ip_config_iter_ip6_route_init (&ipconf_iter_dst, dst); are_equal = TRUE; while (TRUE) { @@ -1282,15 +1281,12 @@ nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relev } } if (!are_equal) { - const NMPlatformIP6Route *r_src; - has_minor_changes = TRUE; nm_dedup_multi_index_dirty_set_idx (dst_priv->multi_idx, &dst_priv->idx_ip6_routes); - nm_dedup_multi_iter_rewind (&ipconf_iter_src); - while (nm_ip_config_iter_ip6_route_next (&ipconf_iter_src, &r_src)) { + nm_dedup_multi_iter_for_each (&ipconf_iter_src, head_entry_src) { nm_dedup_multi_index_add (dst_priv->multi_idx, &dst_priv->idx_ip6_routes, - NMP_OBJECT_UP_CAST (r_src), + ipconf_iter_src.current->obj, NM_DEDUP_MULTI_IDX_MODE_APPEND_FORCE, NULL, NULL); -- cgit v1.2.1