Fix GThreadPool initialization that is breaking createrepo_c (BZ #1795052)
Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
This commit is contained in:
parent
af14559f8f
commit
ab00509fe1
@ -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
|
||||||
|
|
10
glib2.spec
10
glib2.spec
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Name: glib2
|
Name: glib2
|
||||||
Version: 2.63.4
|
Version: 2.63.4
|
||||||
Release: 2%{?dist}
|
Release: 3%{?dist}
|
||||||
Summary: A library of handy utility functions
|
Summary: A library of handy utility functions
|
||||||
|
|
||||||
License: LGPLv2+
|
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
|
# glib 2.59.0 hash table changes broke older gcr versions / password prompts in gnome-shell
|
||||||
Conflicts: gcr < 3.28.1
|
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
|
%description
|
||||||
GLib is the low-level core library that forms the basis for projects
|
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,
|
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
|
%{_datadir}/installed-tests
|
||||||
|
|
||||||
%changelog
|
%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
|
* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 2.63.4-2
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user