From 8c077d50d177e0dff1bcd991d07da883de026892 Mon Sep 17 00:00:00 2001 From: Jehan Date: Sun, 16 Mar 2025 19:24:34 +0100 Subject: [PATCH] plug-ins: revert the multi-threading code. The whole multi-threading changes in the help plug-in seem to badly break on macOS. See discussion in reopened #12898. We decided to get rid of it for now and see later if we need to reimplement this (after understanding what is going on). Revert "plug-ins: fix #13049 Calling help on unknown help-id causes..." This reverts commit 7d153bcc6d54ac7e24b5d4e72c6047f7b7a2656b. Revert "plug-ins/help: fix thread unnecessarily waiting when locale_parse failed" This reverts commit fd0ccfa16cedd5d424a47e78068d78ee448f04f7. Revert "plug-ins/help: fix crash when locale is NULL" This reverts commit 4075add5b45d15e084e68ea39eda6959ae052f7f. Revert "plug-ins: fix failing to access help from within GIMP" This reverts commit 38f0527ebc8c76c4a83e11985c5f56cab174fffa. Revert "plug-ins: add some better error handling when the docs XML request/parsing fails." This reverts commit 543bb374a82bc2d83dfc722cff77587193375971. Revert "plug-ins: try to load the gimp-help.xml file in a thread." This reverts commit f2d47e910bae09ceeba5f71df5f9c1b1c0fc7cad. --- plug-ins/help/gimphelpdomain.c | 104 ++++++--------------------------- plug-ins/help/gimphelplocale.c | 21 ++----- plug-ins/help/gimphelplocale.h | 1 - 3 files changed, 25 insertions(+), 101 deletions(-) diff --git a/plug-ins/help/gimphelpdomain.c b/plug-ins/help/gimphelpdomain.c index c87e4e872c..34997e3b4a 100644 --- a/plug-ins/help/gimphelpdomain.c +++ b/plug-ins/help/gimphelpdomain.c @@ -42,22 +42,8 @@ #endif -typedef struct -{ - gboolean *success; - gboolean *done; - - GimpHelpLocale *locale; - const gchar *uri; - const gchar *domain; - GimpHelpProgress *progress; - GCancellable *cancellable; - GError **error; -} HelpThreadData; - /* local function prototypes */ -static gboolean parse_thread_func (HelpThreadData *data); static gboolean domain_locale_parse (GimpHelpDomain *domain, GimpHelpLocale *locale, GimpHelpProgress *progress, @@ -118,11 +104,9 @@ gimp_help_domain_lookup_locale (GimpHelpDomain *domain, return locale; locale = gimp_help_locale_new (locale_id); + g_hash_table_insert (domain->help_locales, g_strdup (locale_id), locale); - if (! domain_locale_parse (domain, locale, progress, NULL)) - g_clear_pointer (&locale, gimp_help_locale_free); - else - g_hash_table_insert (domain->help_locales, g_strdup (locale_id), locale); + domain_locale_parse (domain, locale, progress, NULL); return locale; } @@ -146,24 +130,25 @@ gimp_help_domain_map (GimpHelpDomain *domain, if (fatal_error) *fatal_error = FALSE; - /* Look for a reference matching the help_id */ + /* first pass: look for a reference matching the help_id */ for (list = help_locales; list && !ref; list = list->next) { locale = gimp_help_domain_lookup_locale (domain, (const gchar *) list->data, progress); - if (locale) - { - ref = gimp_help_locale_map (locale, help_id); - /* It doesn't make sense to keep looking since all available locales - * have the same pages available. If the first locale present - * doesn't have it, the others won't have it either. */ - if (! ref) - ref = locale->help_missing; - } + ref = gimp_help_locale_map (locale, help_id); } - if (ret_locale && locale) + /* second pass: look for a fallback */ + for (list = help_locales; list && !ref; list = list->next) + { + locale = gimp_help_domain_lookup_locale (domain, + (const gchar *) list->data, + progress); + ref = locale->help_missing; + } + + if (ret_locale) *ret_locale = locale; if (ref) @@ -185,7 +170,7 @@ gimp_help_domain_map (GimpHelpDomain *domain, locale = gimp_help_domain_lookup_locale (domain, GIMP_HELP_DEFAULT_LOCALE, NULL); - if (locale && ! domain_locale_parse (domain, locale, NULL, &error)) + if (! domain_locale_parse (domain, locale, NULL, &error)) { switch (error->code) { @@ -243,34 +228,14 @@ gimp_help_domain_map (GimpHelpDomain *domain, /* private functions */ -G_LOCK_DEFINE (done); - -static gboolean -parse_thread_func (HelpThreadData *data) -{ - - *data->success = gimp_help_locale_parse (data->locale, data->uri, data->domain, - data->progress, data->cancellable, data->error); - G_LOCK (done); - *data->done = TRUE; - G_UNLOCK (done); - - return *data->success; -} - static gboolean domain_locale_parse (GimpHelpDomain *domain, GimpHelpLocale *locale, GimpHelpProgress *progress, GError **error) { - GCancellable *cancellable; - gchar *uri; - GThread *thread; - GTimer *timer; - gboolean success = FALSE; - gboolean done = FALSE; - HelpThreadData data; + gchar *uri; + gboolean success; g_return_val_if_fail (domain != NULL, FALSE); g_return_val_if_fail (locale != NULL, FALSE); @@ -279,41 +244,10 @@ domain_locale_parse (GimpHelpDomain *domain, uri = g_strdup_printf ("%s/%s/gimp-help.xml", domain->help_uri, locale->locale_id); - timer = g_timer_new (); - cancellable = g_cancellable_new (); - data.done = &done; - data.success = &success; - data.locale = locale; - data.uri = uri; - data.domain = domain->help_domain; - data.progress = progress; - data.cancellable = cancellable; - data.error = error; - thread = g_thread_new (NULL, (GThreadFunc) parse_thread_func, &data); - - while (TRUE) - { - gboolean exit; - - G_LOCK (done); - exit = *data.done; - G_UNLOCK (done); - - if (! exit && g_timer_elapsed (timer, NULL) > 10.0) - { - g_cancellable_cancel (cancellable); - exit = TRUE; - } - - if (exit) - break; - } - - g_thread_join (thread); + success = gimp_help_locale_parse (locale, uri, domain->help_domain, + progress, error); g_free (uri); - g_timer_destroy (timer); - g_object_unref (cancellable); return success; } diff --git a/plug-ins/help/gimphelplocale.c b/plug-ins/help/gimphelplocale.c index 0612c13fff..ca862e1568 100644 --- a/plug-ins/help/gimphelplocale.c +++ b/plug-ins/help/gimphelplocale.c @@ -169,11 +169,11 @@ gimp_help_locale_parse (GimpHelpLocale *locale, const gchar *uri, const gchar *help_domain, GimpHelpProgress *progress, - GCancellable *cancellable, GError **error) { GMarkupParseContext *context; GFile *file = NULL; + GCancellable *cancellable = NULL; LocaleParser parser = { NULL, }; #ifdef PLATFORM_OSX NSURL *fileURL; @@ -213,15 +213,12 @@ gimp_help_locale_parse (GimpHelpLocale *locale, { gchar *name = g_file_get_parse_name (file); + cancellable = g_cancellable_new (); _gimp_help_progress_start (progress, cancellable, _("Loading index from '%s'"), name); + g_clear_object (&cancellable); g_free (name); - if (g_cancellable_is_cancelled (cancellable)) - { - _gimp_help_progress_finish (progress); - return FALSE; - } } #ifdef PLATFORM_OSX @@ -241,8 +238,6 @@ gimp_help_locale_parse (GimpHelpLocale *locale, locale_set_error (error, _("Could not load data from '%s': %s"), file); g_object_unref (file); - if (progress) - _gimp_help_progress_finish (progress); return FALSE; } @@ -254,13 +249,12 @@ gimp_help_locale_parse (GimpHelpLocale *locale, GFileInfo *info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_SIZE, 0, cancellable, error); - if (! info || g_cancellable_is_cancelled (cancellable)) + if (! info) { locale_set_error (error, _("Could not open '%s' for reading: %s"), file); g_object_unref (file); - _gimp_help_progress_finish (progress); return FALSE; } @@ -271,15 +265,12 @@ gimp_help_locale_parse (GimpHelpLocale *locale, stream = g_file_read (file, cancellable, error); - if (! stream || g_cancellable_is_cancelled (cancellable)) + if (! stream) { locale_set_error (error, _("Could not open '%s' for reading: %s"), file); g_object_unref (file); - if (progress) - _gimp_help_progress_finish (progress); - return FALSE; } #endif /* ! PLATFORM_OSX */ @@ -316,7 +307,7 @@ gimp_help_locale_parse (GimpHelpLocale *locale, g_string_free (parser.value, TRUE); g_free (parser.id_attr_name); - if (! success || g_cancellable_is_cancelled (cancellable)) + if (! success) locale_set_error (error, _("Parse error in '%s':\n%s"), file); g_object_unref (file); diff --git a/plug-ins/help/gimphelplocale.h b/plug-ins/help/gimphelplocale.h index f8472841b7..8dd57a6bf5 100644 --- a/plug-ins/help/gimphelplocale.h +++ b/plug-ins/help/gimphelplocale.h @@ -45,7 +45,6 @@ gboolean gimp_help_locale_parse (GimpHelpLocale *locale, const gchar *uri, const gchar *help_domain, GimpHelpProgress *progress, - GCancellable *cancellable, GError **error);