gtk4/0001-paralleltask-Let-callers-limit-parallelism.patch
Matthias Clasen 7eaaf6daab Limit threadpool size
Resolves: RHEL-132190
2026-06-01 21:55:05 -04:00

126 lines
4.4 KiB
Diff

From 3f798a2017581b67001622584612ab9af92e2b96 Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Sun, 24 Nov 2024 10:02:20 -0500
Subject: [PATCH] paralleltask: Let callers limit parallelism
Add a max_tasks argument to gdk_parallel_task_run. This will
help reduce setup overhead in small cases. For now, all callers
pass G_MAXUINT.
---
gdk/gdkmemoryformat.c | 14 +++++++-------
gdk/gdkparalleltask.c | 8 +++++---
gdk/gdkparalleltaskprivate.h | 3 ++-
3 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/gdk/gdkmemoryformat.c b/gdk/gdkmemoryformat.c
index 6473fa1567..05821e31d8 100644
--- a/gdk/gdkmemoryformat.c
+++ b/gdk/gdkmemoryformat.c
@@ -2267,7 +2267,7 @@ gdk_memory_convert (guchar *dest_data,
return;
}
- gdk_parallel_task_run (gdk_memory_convert_generic, &mc);
+ gdk_parallel_task_run (gdk_memory_convert_generic, &mc, G_MAXUINT);
}
typedef struct _MemoryConvertColorState MemoryConvertColorState;
@@ -2512,17 +2512,17 @@ gdk_memory_convert_color_state (guchar *data,
src_cs == GDK_COLOR_STATE_SRGB &&
dest_cs == GDK_COLOR_STATE_SRGB_LINEAR)
{
- gdk_parallel_task_run (gdk_memory_convert_color_state_srgb_to_srgb_linear, &mc);
+ gdk_parallel_task_run (gdk_memory_convert_color_state_srgb_to_srgb_linear, &mc, G_MAXUINT);
}
else if (format == GDK_MEMORY_B8G8R8A8_PREMULTIPLIED &&
src_cs == GDK_COLOR_STATE_SRGB_LINEAR &&
dest_cs == GDK_COLOR_STATE_SRGB)
{
- gdk_parallel_task_run (gdk_memory_convert_color_state_srgb_linear_to_srgb, &mc);
+ gdk_parallel_task_run (gdk_memory_convert_color_state_srgb_linear_to_srgb, &mc, G_MAXUINT);
}
else
{
- gdk_parallel_task_run (gdk_memory_convert_color_state_generic, &mc);
+ gdk_parallel_task_run (gdk_memory_convert_color_state_generic, &mc, G_MAXUINT);
}
}
@@ -2684,13 +2684,13 @@ gdk_memory_mipmap (guchar *dest,
if (dest_format == src_format)
{
if (linear)
- gdk_parallel_task_run (gdk_memory_mipmap_same_format_linear, &mipmap);
+ gdk_parallel_task_run (gdk_memory_mipmap_same_format_linear, &mipmap, G_MAXUINT);
else
- gdk_parallel_task_run (gdk_memory_mipmap_same_format_nearest, &mipmap);
+ gdk_parallel_task_run (gdk_memory_mipmap_same_format_nearest, &mipmap, G_MAXUINT);
}
else
{
- gdk_parallel_task_run (gdk_memory_mipmap_generic, &mipmap);
+ gdk_parallel_task_run (gdk_memory_mipmap_generic, &mipmap, G_MAXUINT);
}
}
diff --git a/gdk/gdkparalleltask.c b/gdk/gdkparalleltask.c
index 0cb4440a87..683df5b927 100644
--- a/gdk/gdkparalleltask.c
+++ b/gdk/gdkparalleltask.c
@@ -45,13 +45,15 @@
* gdk_parallel_task_run:
* @task_func: the function to spawn
* @task_data: data to pass to the function
+ * @max_tasks: maximum number of tasks to spawn
*
* Spawns the given function in many threads.
* Once all functions have exited, this function returns.
**/
void
gdk_parallel_task_run (GdkTaskFunc task_func,
- gpointer task_data)
+ gpointer task_data,
+ guint max_tasks)
{
static GThreadPool *pool;
TaskData task = {
@@ -60,6 +62,12 @@
};
int i, n_tasks;
+ if (max_tasks == 1)
+ {
+ task_func (task_data);
+ return;
+ }
+
if (g_once_init_enter (&pool))
{
guint num_threads = CLAMP (2, g_get_num_processors () - 1, 32);
@@ -72,7 +80,7 @@
g_once_init_leave (&pool, the_pool);
}
- n_tasks = g_get_num_processors ();
+ n_tasks = MIN (max_tasks, g_get_num_processors ());
task.n_running_tasks = n_tasks;
/* Start with 1 because we run 1 task ourselves */
for (i = 1; i < n_tasks; i++)
diff --git a/gdk/gdkparalleltaskprivate.h b/gdk/gdkparalleltaskprivate.h
index a20fb72f95..2e531beb40 100644
--- a/gdk/gdkparalleltaskprivate.h
+++ b/gdk/gdkparalleltaskprivate.h
@@ -26,7 +26,8 @@ G_BEGIN_DECLS
typedef void (* GdkTaskFunc) (gpointer user_data);
void gdk_parallel_task_run (GdkTaskFunc task_func,
- gpointer task_data);
+ gpointer task_data,
+ guint max_tasks);
G_END_DECLS
--
2.53.0