diff --git a/0001-Fix-initialization-logic-of-GThreadPool-if-the-first.patch b/0001-Fix-initialization-logic-of-GThreadPool-if-the-first.patch new file mode 100644 index 0000000..568ac7b --- /dev/null +++ b/0001-Fix-initialization-logic-of-GThreadPool-if-the-first.patch @@ -0,0 +1,99 @@ +From 78bae85d215e3e1ce77c828c2075d216edbc36f6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= +Date: Sat, 25 Jan 2020 11:08:22 +0200 +Subject: [PATCH] Fix initialization logic of GThreadPool if the first created + pool is an exclusive one + +Previously we would only ever run the initialization code once, but part +of it only if a non-exclusive pool was created. This caused the shared +state to be inconsistent if the first pool to be created was exclusive +and the second non-exclusive. + +Fixes https://gitlab.gnome.org/GNOME/glib/issues/2012 +--- + glib/gthreadpool.c | 67 +++++++++++++++++++++++----------------------- + 1 file changed, 33 insertions(+), 34 deletions(-) + +diff --git a/glib/gthreadpool.c b/glib/gthreadpool.c +index dd6546be4568c7b819145d8cbc6654c9c182f767..ed34fcd525b63937636ae31b1461af8341e578e5 100644 +--- a/glib/gthreadpool.c ++++ b/glib/gthreadpool.c +@@ -579,42 +579,41 @@ g_thread_pool_new (GFunc func, + + G_LOCK (init); + if (!unused_thread_queue) +- { + unused_thread_queue = g_async_queue_new (); +- /* For the very first non-exclusive thread-pool we remember the thread +- * scheduler settings of the thread creating the pool, if supported by +- * the GThread implementation. This is then used for making sure that +- * all threads created on the non-exclusive thread-pool have the same +- * scheduler settings, and more importantly don't just inherit them +- * from the thread that just happened to push a new task and caused +- * a new thread to be created. +- * +- * Not doing so could cause real-time priority threads or otherwise +- * threads with problematic scheduler settings to be part of the +- * non-exclusive thread-pools. +- * +- * If this is not supported by the GThread implementation then we here +- * start a thread that will inherit the scheduler settings from this +- * very thread and whose only purpose is to spawn new threads with the +- * same settings for use by the non-exclusive thread-pools. +- * +- * +- * For non-exclusive thread-pools this is not required as all threads +- * are created immediately below and are running forever, so they will +- * automatically inherit the scheduler settings from this very thread. +- */ +- if (!exclusive) ++ ++ /* For the very first non-exclusive thread-pool we remember the thread ++ * scheduler settings of the thread creating the pool, if supported by ++ * the GThread implementation. This is then used for making sure that ++ * all threads created on the non-exclusive thread-pool have the same ++ * scheduler settings, and more importantly don't just inherit them ++ * from the thread that just happened to push a new task and caused ++ * a new thread to be created. ++ * ++ * Not doing so could cause real-time priority threads or otherwise ++ * threads with problematic scheduler settings to be part of the ++ * non-exclusive thread-pools. ++ * ++ * If this is not supported by the GThread implementation then we here ++ * start a thread that will inherit the scheduler settings from this ++ * very thread and whose only purpose is to spawn new threads with the ++ * same settings for use by the non-exclusive thread-pools. ++ * ++ * ++ * For non-exclusive thread-pools this is not required as all threads ++ * are created immediately below and are running forever, so they will ++ * automatically inherit the scheduler settings from this very thread. ++ */ ++ if (!exclusive && !have_shared_thread_scheduler_settings && !spawn_thread_queue) ++ { ++ if (g_thread_get_scheduler_settings (&shared_thread_scheduler_settings)) + { +- if (g_thread_get_scheduler_settings (&shared_thread_scheduler_settings)) +- { +- have_shared_thread_scheduler_settings = TRUE; +- } +- else +- { +- spawn_thread_queue = g_async_queue_new (); +- g_cond_init (&spawn_thread_cond); +- g_thread_new ("pool-spawner", g_thread_pool_spawn_thread, NULL); +- } ++ have_shared_thread_scheduler_settings = TRUE; ++ } ++ else ++ { ++ spawn_thread_queue = g_async_queue_new (); ++ g_cond_init (&spawn_thread_cond); ++ g_thread_new ("pool-spawner", g_thread_pool_spawn_thread, NULL); + } + } + G_UNLOCK (init); +-- +2.24.1 + diff --git a/glib2.spec b/glib2.spec index e5794fd..1554154 100644 --- a/glib2.spec +++ b/glib2.spec @@ -2,7 +2,7 @@ Name: glib2 Version: 2.63.4 -Release: 2%{?dist} +Release: 3%{?dist} Summary: A library of handy utility functions License: LGPLv2+ @@ -35,6 +35,11 @@ Recommends: shared-mime-info # glib 2.59.0 hash table changes broke older gcr versions / password prompts in gnome-shell Conflicts: gcr < 3.28.1 +# Patches from upstream + +# Fix for https://gitlab.gnome.org/GNOME/glib/issues/2012 +Patch0001: 0001-Fix-initialization-logic-of-GThreadPool-if-the-first.patch + %description GLib is the low-level core library that forms the basis for projects such as GTK+ and GNOME. It provides data structure handling for C, @@ -216,6 +221,9 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || : %{_datadir}/installed-tests %changelog +* Wed Jan 29 2020 Stephen Gallagher - 2.63.4-3 +- Fix GThreadPool initialization that is breaking createrepo_c (BZ #1795052) + * Tue Jan 28 2020 Fedora Release Engineering - 2.63.4-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild