[gnome-network-displays] meta-provider: Do not cache matches in hash table
- From: Benjamin Berg <bberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-network-displays] meta-provider: Do not cache matches in hash table
- Date: Tue, 20 Apr 2021 12:21:42 +0000 (UTC)
commit 7581f1ddb43bc986c227e701a5bd20061ab01e68
Author: Benjamin Berg <bberg redhat com>
Date: Tue Apr 20 12:22:49 2021 +0200
meta-provider: Do not cache matches in hash table
This is less efficient, but we did not delete matches again from our
lookup table, and the fix for that is also not great. So just do a flat
search across everything, which should be entirely fine because we
should never have more than a small amount of sinks.
src/nd-meta-provider.c | 40 +++-------------------------------------
src/nd-meta-sink.c | 38 ++++++++++++++++++++++++++++++++++++++
src/nd-meta-sink.h | 3 ++-
3 files changed, 43 insertions(+), 38 deletions(-)
---
diff --git a/src/nd-meta-provider.c b/src/nd-meta-provider.c
index 2f8cbff..397f834 100644
--- a/src/nd-meta-provider.c
+++ b/src/nd-meta-provider.c
@@ -26,7 +26,6 @@ struct _NdMetaProvider
gboolean discover;
- GHashTable *deduplicate;
GPtrArray *sinks;
GPtrArray *providers;
};
@@ -49,44 +48,22 @@ G_DEFINE_TYPE_EXTENDED (NdMetaProvider, nd_meta_provider, G_TYPE_OBJECT, 0,
)
-static void
-deduplicate_add_meta_sink (NdMetaProvider *meta_provider, NdMetaSink *meta_sink)
-{
- g_autoptr(GPtrArray) meta_matches = NULL;
-
- g_object_get (meta_sink, "matches", &meta_matches, NULL);
- g_assert (meta_matches != NULL);
-
- for (gint i = 0; i < meta_matches->len; i++)
- {
- gchar *match;
- match = meta_matches->pdata[i];
-
- g_hash_table_insert (meta_provider->deduplicate, g_strdup (match), meta_sink);
- }
-}
-
static void
provider_sink_added_cb (NdMetaProvider *meta_provider, NdSink *sink, NdProvider *provider)
{
g_autoptr(GPtrArray) sink_matches = NULL;
g_autoptr(GPtrArray) meta_sinks = NULL;
NdMetaSink *meta_sink;
- gchar *match;
g_object_get (sink, "matches", &sink_matches, NULL);
g_assert (sink_matches != NULL);
meta_sinks = g_ptr_array_new ();
- for (gint i = 0; i < sink_matches->len; i++)
+ for (gint i = 0; i < meta_provider->sinks->len; i++)
{
- match = sink_matches->pdata[i];
-
- meta_sink = g_hash_table_lookup (meta_provider->deduplicate, match);
-
- if (meta_sink)
- g_ptr_array_add (meta_sinks, meta_sink);
+ if (nd_meta_sink_matches_sink (g_ptr_array_index (meta_provider->sinks, i), sink))
+ g_ptr_array_add (meta_sinks, g_ptr_array_index (meta_provider->sinks, i));
}
if (meta_sinks->len > 1)
@@ -120,9 +97,6 @@ provider_sink_added_cb (NdMetaProvider *meta_provider, NdSink *sink, NdProvider
g_signal_emit_by_name (meta_provider, "sink-added", meta_sink);
g_ptr_array_add (meta_provider->sinks, meta_sink);
}
-
- /* Add/Update matches in the deduplication dictionary */
- deduplicate_add_meta_sink (meta_provider, meta_sink);
}
static void
@@ -154,10 +128,6 @@ provider_sink_removed_cb (NdMetaProvider *meta_provider, NdSink *sink, NdProvide
return;
}
-
- /* Add/Update matches in the deduplication dictionary as we will
- * have removed too many. */
- deduplicate_add_meta_sink (meta_provider, meta_sink);
}
static void
@@ -213,8 +183,6 @@ nd_meta_provider_finalize (GObject *object)
{
NdMetaProvider *meta_provider = ND_META_PROVIDER (object);
- g_clear_pointer (&meta_provider->deduplicate, g_hash_table_unref);
-
g_ptr_array_free (meta_provider->sinks, TRUE);
meta_provider->sinks = NULL;
g_ptr_array_free (meta_provider->providers, TRUE);
@@ -252,8 +220,6 @@ nd_meta_provider_init (NdMetaProvider *meta_provider)
meta_provider->sinks = g_ptr_array_new_with_free_func (g_object_unref);
meta_provider->providers = g_ptr_array_new_with_free_func (g_object_unref);
-
- meta_provider->deduplicate = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
}
/******************************************************************
diff --git a/src/nd-meta-sink.c b/src/nd-meta-sink.c
index 25117f1..0817184 100644
--- a/src/nd-meta-sink.c
+++ b/src/nd-meta-sink.c
@@ -377,6 +377,44 @@ nd_meta_sink_has_sink (NdMetaSink *meta_sink,
return g_ptr_array_find (meta_sink->sinks, sink, NULL);
}
+/**
+ * nd_meta_sink_matches_sink:
+ * @meta_sink: a #NdMetaSink
+ * @sink: a #NdSink
+ *
+ * Checks whether meta sink can be considered equal to the given sink.
+ *
+ * Returns:
+ * Whether @sink should be contained in @meta_sink.
+ */
+gboolean
+nd_meta_sink_matches_sink (NdMetaSink *meta_sink,
+ NdSink *sink)
+{
+ g_autoptr(GPtrArray) needles = NULL;
+
+ g_object_get (sink, "matches", &needles, NULL);
+
+ g_return_val_if_fail (needles, FALSE);
+
+ for (gint i = 0; i < meta_sink->sinks->len; i++)
+ {
+ g_autoptr(GPtrArray) sub_matches = NULL;
+
+ g_object_get (g_ptr_array_index (meta_sink->sinks, i),
+ "matches", &sub_matches,
+ NULL);
+
+ for (gint j = 0; j < needles->len; j++)
+ if (g_ptr_array_find_with_equal_func (sub_matches,
+ g_ptr_array_index (needles, j),
+ g_str_equal, NULL))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
NdMetaSink *
nd_meta_sink_new (NdSink *sink)
{
diff --git a/src/nd-meta-sink.h b/src/nd-meta-sink.h
index 4c3d2ce..bf0883e 100644
--- a/src/nd-meta-sink.h
+++ b/src/nd-meta-sink.h
@@ -34,6 +34,7 @@ gboolean nd_meta_sink_remove_sink (NdMetaSink *meta_sink,
NdSink *sink);
gboolean nd_meta_sink_has_sink (NdMetaSink *meta_sink,
NdSink *sink);
-
+gboolean nd_meta_sink_matches_sink (NdMetaSink *meta_sink,
+ NdSink *sink);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]