summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett Regier <garrettregier@gmail.com>2014-05-29 18:40:33 -0700
committerGarrett Regier <garrettregier@gmail.com>2014-06-28 05:52:02 -0700
commit3bebe412722d5dff4bc908aee3b6345406ba7c60 (patch)
treea71978dcc8b5af6fd2076b1aadb73d0cde10acad
parenta7f3641d007b60c47334a269a4970a5791994201 (diff)
downloadlibpeas-3bebe412722d5dff4bc908aee3b6345406ba7c60.tar.gz
Prevent and warn when trying to enable multiple loaders
Using multiple plugin loaders will cause memory leaks due to both the python 2/3 and seed binding using toggle refs. Also mixing python version will never work.
-rw-r--r--libpeas/peas-engine.c34
-rw-r--r--peas-demo/peas-demo.c2
-rw-r--r--tests/libpeas/extension-py.c3
3 files changed, 36 insertions, 3 deletions
diff --git a/libpeas/peas-engine.c b/libpeas/peas-engine.c
index 9d66f08..608dbfa 100644
--- a/libpeas/peas-engine.c
+++ b/libpeas/peas-engine.c
@@ -712,14 +712,20 @@ get_plugin_loader (PeasEngine *engine,
* @loader_id: The id of the loader to enable.
*
* Enable a loader, enables a loader for plugins.
- * The C plugin loader is always enabled.
+ * The C plugin loader is always enabled. The other plugin
+ * loaders are: python, python3 and seed.
*
- * For instance, the following code will enable python plugin
- * from being loaded:
+ * For instance, the following code will enable python plugins
+ * to be loaded:
* |[
* peas_engine_enable_loader (engine, "python");
* ]|
*
+ * Due to the use of toggle references in the python, python3 and
+ * seed bindings only one of them should be enabled. Otherwise vast
+ * memory leaks are to be expected and as such it is an error to
+ * enable more than one of them.
+ *
* Note: plugin loaders are shared across #PeasEngines so enabling
* a loader on one #PeasEngine will enable it on all #PeasEngines.
**/
@@ -733,6 +739,28 @@ peas_engine_enable_loader (PeasEngine *engine,
if (g_hash_table_lookup_extended (loaders, loader_id, NULL, NULL))
return;
+ /* The demo and some tests need to load multiple loaders */
+ if (g_getenv ("PEAS_ALLOW_ALL_LOADERS") == NULL)
+ {
+ static const gchar *plugin_loader_ids[] = {"python", "python3", "seed"};
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (plugin_loader_ids); ++i)
+ {
+ if (g_ascii_strcasecmp (loader_id, plugin_loader_ids[i]) == 0)
+ continue;
+
+ if (g_hash_table_lookup_extended (loaders, plugin_loader_ids[i],
+ NULL, NULL))
+ {
+ g_warning ("Cannot enable plugin loader '%s' as the "
+ "'%s' plugin loader has already been enabled.",
+ loader_id, plugin_loader_ids[i]);
+ return;
+ }
+ }
+ }
+
/* We do not load the plugin loader immediately and instead
* load it in get_plugin_loader() so that it is loaded lazily.
*/
diff --git a/peas-demo/peas-demo.c b/peas-demo/peas-demo.c
index 22fb41e..c0c0bca 100644
--- a/peas-demo/peas-demo.c
+++ b/peas-demo/peas-demo.c
@@ -125,6 +125,8 @@ main (int argc,
peas_engine_add_search_path (engine, plugin_dir, plugin_dir);
g_free (plugin_dir);
+ /* We don't care about leaking memory */
+ g_setenv ("PEAS_ALLOW_ALL_LOADERS", "1", TRUE);
peas_engine_enable_loader (engine, "python3");
peas_engine_enable_loader (engine, "seed");
diff --git a/tests/libpeas/extension-py.c b/tests/libpeas/extension-py.c
index b50eeb9..5cb7788 100644
--- a/tests/libpeas/extension-py.c
+++ b/tests/libpeas/extension-py.c
@@ -180,6 +180,9 @@ test_extension_py_mixed_python_subprocess (void)
testing_util_push_log_hook ("*Could not find loader '"
ALT_PY_LOADER_STR "'*");
+ /* Required when loading multiple loaders */
+ g_setenv ("PEAS_ALLOW_ALL_LOADERS", "1", TRUE);
+
engine = testing_engine_new ();
peas_engine_enable_loader (engine, ALT_PY_LOADER_STR);