gplugin/gplugin

Parents e876b73d0be2
Children a65b85a23ae3
Use a local error in gplugin_manager_real_unload_plugin so everyone gets an error regardless of whether or not the caller passed one in.
--- a/gplugin/gplugin-manager.c Sat Apr 11 06:11:29 2020 -0500
+++ b/gplugin/gplugin-manager.c Sat Apr 11 18:39:18 2020 -0500
@@ -991,9 +991,10 @@
gplugin_manager_real_unload_plugin(
GPluginManager *manager,
GPluginPlugin *plugin,
- GError **error)
+ GError **ret_error)
{
GPluginLoader *loader = NULL;
+ GError *error = NULL;
gboolean ret = TRUE;
g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), FALSE);
@@ -1004,7 +1005,7 @@
loader = gplugin_plugin_get_loader(plugin);
if(!GPLUGIN_IS_LOADER(loader)) {
g_set_error_literal(
- error,
+ ret_error,
GPLUGIN_DOMAIN,
0,
_("Plugin loader is not a loader"));
@@ -1012,19 +1013,27 @@
return FALSE;
}
- g_signal_emit(manager, signals[SIG_UNLOADING], 0, plugin, error, &ret);
- if(!ret)
+ g_signal_emit(manager, signals[SIG_UNLOADING], 0, plugin, &error, &ret);
+ if(!ret) {
+ g_propagate_error(ret_error, error);
+
return ret;
+ }
- ret = gplugin_loader_unload_plugin(loader, plugin, error);
+ ret = gplugin_loader_unload_plugin(loader, plugin, &error);
if(ret) {
gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_QUERIED);
+ g_signal_emit(manager, signals[SIG_UNLOADED], 0, plugin);
- g_signal_emit(manager, signals[SIG_UNLOADED], 0, plugin);
+ /* if the plugin successfully loaded but returned an error, ignore the
+ * error.
+ */
+ g_clear_error(&error);
} else {
gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_UNLOAD_FAILED);
+ g_signal_emit(manager, signals[SIG_UNLOAD_FAILED], 0, plugin, error);
- g_signal_emit(manager, signals[SIG_UNLOAD_FAILED], 0, plugin, error);
+ g_propagate_error(ret_error, error);
}
return ret;