126 lines
4.4 KiB
Diff
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
|
|
|