summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-09-23 14:32:50 +0200
committerThomas Haller <thaller@redhat.com>2016-09-23 15:13:15 +0200
commitaf78fd1c41b4b56a2a43fe1dc27e4b7a566f1549 (patch)
tree0f3e164efcb5dd11ef700d08d340cd3a98eb2830
parent34321784da3fae41da920a4afefee511bf02cb74 (diff)
downloadNetworkManager-th/caps-rh1375967.tar.gz
core: use binary-search for nm_manager_set_capability()th/caps-rh1375967
And drop the unused function nm_manager_check_capability(). I don't think we need such a function server-side, as the server usually has better ways to check whether a capability is supported.
-rw-r--r--src/nm-manager.c50
-rw-r--r--src/nm-manager.h1
2 files changed, 21 insertions, 30 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c
index ca086b4432..dca31f22ff 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -5440,41 +5440,33 @@ dbus_connection_changed_cb (NMBusManager *dbus_mgr,
/**********************************************************************/
-gboolean
-nm_manager_check_capability (NMManager *self,
- NMCapability cap)
+void
+nm_manager_set_capability (NMManager *self,
+ NMCapability cap)
{
- NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
- int i;
+ NMManagerPrivate *priv;
+ guint32 cap_i;
+ gssize idx;
- for (i = 0; i < priv->capabilities->len; i++) {
- NMCapability test = g_array_index (priv->capabilities, guint32, i);
- if (test == cap)
- return TRUE;
- if (test > cap)
- return FALSE;
- }
+ g_return_if_fail (NM_IS_MANAGER (self));
+ if (cap < 1 || cap > NM_CAPABILITY_TEAM)
+ g_return_if_reached ();
- return FALSE;
-}
+ cap_i = (guint32) cap;
-static int
-cmp_caps (gconstpointer a, gconstpointer b)
-{
- return *(gint *)a - *(gint *)b;
-}
+ priv = NM_MANAGER_GET_PRIVATE (self);
-void
-nm_manager_set_capability (NMManager *self,
- NMCapability cap)
-{
- NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
+ idx = _nm_utils_arrayu32_find_binary_search (&g_array_index (priv->capabilities, guint32, 0),
+ priv->capabilities->len,
+ cap_i,
+ TRUE);
+ if (idx >= 0)
+ return;
- if (!nm_manager_check_capability (self, cap)) {
- g_array_append_val (priv->capabilities, cap);
- g_array_sort (priv->capabilities, cmp_caps);
- _notify (self, PROP_CAPABILITIES);
- }
+ nm_assert ((~idx) <= (gssize) priv->capabilities->len);
+
+ g_array_insert_val (priv->capabilities, ~idx, cap_i);
+ _notify (self, PROP_CAPABILITIES);
}
/**********************************************************************/
diff --git a/src/nm-manager.h b/src/nm-manager.h
index deccbdba53..11c4eb4a18 100644
--- a/src/nm-manager.h
+++ b/src/nm-manager.h
@@ -112,7 +112,6 @@ gboolean nm_manager_deactivate_connection (NMManager *manager,
NMDeviceStateReason reason,
GError **error);
-gboolean nm_manager_check_capability (NMManager *self, NMCapability cap);
void nm_manager_set_capability (NMManager *self, NMCapability cap);
#endif /* __NETWORKMANAGER_MANAGER_H__ */