Fix GThreadPool initialization that is breaking createrepo_c (BZ #1795052)

Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
This commit is contained in:
Stephen Gallagher 2020-01-29 10:11:54 -05:00
parent af14559f8f
commit ab00509fe1
No known key found for this signature in database
GPG Key ID: 7A25556236BAA3A3
2 changed files with 108 additions and 1 deletions

View File

@ -0,0 +1,99 @@
From 78bae85d215e3e1ce77c828c2075d216edbc36f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com>
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

View File

@ -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 <sgallagh@redhat.com> - 2.63.4-3
- Fix GThreadPool initialization that is breaking createrepo_c (BZ #1795052)
* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 2.63.4-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild