[gnome-builder/wip/extensions] extension-points: track plugin load/unload state
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/extensions] extension-points: track plugin load/unload state
- Date: Sat, 27 Jun 2015 08:48:10 +0000 (UTC)
commit 45b9c520c9a53f5243ea728f206b411ca6d5032c
Author: Christian Hergert <christian hergert me>
Date: Sat Jun 27 01:47:30 2015 -0700
extension-points: track plugin load/unload state
Mark extension as unloaded when the plugin is unloaded instead of
removing it. Re-enable if we see it loaded again.
libide/ide-extension-point.c | 94 ++++++++++++++++++++++++++++++------------
1 files changed, 68 insertions(+), 26 deletions(-)
---
diff --git a/libide/ide-extension-point.c b/libide/ide-extension-point.c
index 7ab812a..e964e8a 100644
--- a/libide/ide-extension-point.c
+++ b/libide/ide-extension-point.c
@@ -35,6 +35,7 @@ typedef struct
const gchar *module_name;
GType type;
gint priority;
+ guint loaded : 1;
} IdeExtension;
enum {
@@ -65,6 +66,7 @@ ide_extension_new (GType type,
exten = g_slice_new0 (IdeExtension);
exten->type = type;
exten->priority = priority;
+ exten->loaded = TRUE;
plugin = g_type_get_plugin (type);
@@ -81,19 +83,54 @@ ide_extension_new (GType type,
}
static void
-ide_extension_free (IdeExtension *exten)
+load_plugin_cb (PeasEngine *engine,
+ PeasPluginInfo *plugin_info,
+ gpointer unused)
{
- g_slice_free (IdeExtension, exten);
-}
+ const gchar *module_name;
+ GHashTableIter iter;
+ gpointer key;
+ gpointer value;
-static void
-ide_extension_point_changed (IdeExtensionPoint *self)
-{
- g_assert (IDE_IS_EXTENSION_POINT (self));
+ g_assert (PEAS_IS_ENGINE (engine));
+ g_assert (plugin_info != NULL);
+
+ /*
+ * FIXME: Since we don't have loader information, we could possibly have
+ * two plugins from different loaders with the same module name.
+ */
+
+ module_name = peas_plugin_info_get_module_name (plugin_info);
- g_print ("cahnged!!!\n");
+ g_rec_mutex_lock (&gExtensionsMutex);
- g_signal_emit (self, gSignals [CHANGED], 0);
+ g_hash_table_iter_init (&iter, gExtensions);
+
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ {
+ IdeExtensionPoint *point = value;
+ gboolean emit_changed = FALSE;
+ gsize i;
+
+ for (i = 0; i < point->extensions->len; i++)
+ {
+ IdeExtension *exten = g_ptr_array_index (point->extensions, i);
+
+ if (g_strcmp0 (exten->module_name, module_name) == 0)
+ {
+ if (exten->loaded != TRUE)
+ {
+ exten->loaded = TRUE;
+ emit_changed = TRUE;
+ }
+ }
+ }
+
+ if (emit_changed)
+ g_signal_emit (point, gSignals [CHANGED], 0);
+ }
+
+ g_rec_mutex_unlock (&gExtensionsMutex);
}
static void
@@ -123,6 +160,7 @@ unload_plugin_cb (PeasEngine *engine,
while (g_hash_table_iter_next (&iter, &key, &value))
{
IdeExtensionPoint *point = value;
+ gboolean emit_changed = FALSE;
gsize i;
for (i = 0; i < point->extensions->len; i++)
@@ -131,12 +169,16 @@ unload_plugin_cb (PeasEngine *engine,
if (g_strcmp0 (exten->module_name, module_name) == 0)
{
- g_ptr_array_remove_index (point->extensions, i);
- if (i == 0)
- ide_extension_point_changed (point);
- ide_extension_free (exten);
+ if (exten->loaded != FALSE)
+ {
+ exten->loaded = FALSE;
+ emit_changed = TRUE;
+ }
}
}
+
+ if (emit_changed)
+ g_signal_emit (point, gSignals [CHANGED], 0);
}
g_rec_mutex_unlock (&gExtensionsMutex);
@@ -153,6 +195,10 @@ ensure_plugin_signals_locked (void)
engine = peas_engine_get_default ();
g_signal_connect (engine,
+ "load-plugin",
+ G_CALLBACK (load_plugin_cb),
+ NULL);
+ g_signal_connect (engine,
"unload-plugin",
G_CALLBACK (unload_plugin_cb),
NULL);
@@ -291,7 +337,6 @@ ide_extension_point_implement (const gchar *name,
{
IdeExtensionPoint *self;
IdeExtension *exten;
- gboolean emit_changed = TRUE;
g_return_if_fail (name);
g_return_if_fail (*name != '\0');
@@ -301,19 +346,10 @@ ide_extension_point_implement (const gchar *name,
self = ide_extension_point_lookup (name);
exten = ide_extension_new (implementation_type, priority);
- if (self->extensions->len > 0)
- {
- IdeExtension *first = g_ptr_array_index (self->extensions, 0);
-
- if (first->priority < priority)
- emit_changed = FALSE;
- }
-
g_ptr_array_add (self->extensions, exten);
g_ptr_array_sort (self->extensions, compare_extension);
- if (emit_changed)
- g_signal_emit (self, gSignals [CHANGED], 0);
+ g_signal_emit (self, gSignals [CHANGED], 0);
}
/**
@@ -331,12 +367,18 @@ ide_extension_point_create (const gchar *name,
IdeExtensionPoint *self;
gpointer ret = NULL;
va_list args;
+ gint i;
self = ide_extension_point_lookup (name);
- if (self->extensions->len > 0)
+ for (i = 0; (ret == NULL) && (i < self->extensions->len); i++)
{
- IdeExtension *exten = g_ptr_array_index (self->extensions, 0);
+ IdeExtension *exten;
+
+ exten = g_ptr_array_index (self->extensions, i);
+
+ if (!exten->loaded)
+ continue;
va_start (args, first_property);
ret = g_object_new_valist (exten->type, first_property, args);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]