mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-07-30 05:43:28 +02:00
GThreadPool - Don't inherit thread priorities when creating new threads
By default (on POSIX) we would be inheriting thread priorities from the thread that pushed a new task on non-exclusive thread pools and causes a new thread to be created. This can cause any non-exclusive thread pool to accidentally contain threads of different priorities, or e.g. threads with real-time priority. To prevent this, custom handling for setting the scheduler settings for Linux and Windows is added and as a fallback for other platforms a new thread is added that is responsible for spawning threads for non-exclusive thread pools. Fixes https://gitlab.gnome.org/GNOME/glib/issues/1834
This commit is contained in:
@@ -35,27 +35,54 @@ struct _GRealThread
|
||||
};
|
||||
|
||||
/* system thread implementation (gthread-posix.c, gthread-win32.c) */
|
||||
|
||||
/* Platform-specific scheduler settings for a thread */
|
||||
typedef struct _GThreadSchedulerSettings GThreadSchedulerSettings;
|
||||
|
||||
/* TODO: Add the same for macOS and the BSDs */
|
||||
#if defined(__linux__)
|
||||
struct _GThreadSchedulerSettings
|
||||
{
|
||||
struct sched_attr *attr;
|
||||
};
|
||||
|
||||
#define HAVE_GTHREAD_SCHEDULER_SETTINGS 1
|
||||
|
||||
#elif defined(G_OS_WIN32)
|
||||
struct _GThreadSchedulerSettings
|
||||
{
|
||||
gint thread_prio;
|
||||
};
|
||||
|
||||
#define HAVE_GTHREAD_SCHEDULER_SETTINGS 1
|
||||
#endif
|
||||
|
||||
void g_system_thread_wait (GRealThread *thread);
|
||||
|
||||
GRealThread * g_system_thread_new (GThreadFunc proxy,
|
||||
gulong stack_size,
|
||||
const char *name,
|
||||
GThreadFunc func,
|
||||
gpointer data,
|
||||
GError **error);
|
||||
GRealThread *g_system_thread_new (GThreadFunc proxy,
|
||||
gulong stack_size,
|
||||
const GThreadSchedulerSettings *scheduler_settings,
|
||||
const char *name,
|
||||
GThreadFunc func,
|
||||
gpointer data,
|
||||
GError **error);
|
||||
void g_system_thread_free (GRealThread *thread);
|
||||
|
||||
void g_system_thread_exit (void);
|
||||
void g_system_thread_set_name (const gchar *name);
|
||||
|
||||
void g_system_thread_get_scheduler_settings (GThreadSchedulerSettings *scheduler_settings);
|
||||
|
||||
/* gthread.c */
|
||||
GThread * g_thread_new_internal (const gchar *name,
|
||||
GThreadFunc proxy,
|
||||
GThreadFunc func,
|
||||
gpointer data,
|
||||
gsize stack_size,
|
||||
GError **error);
|
||||
GThread *g_thread_new_internal (const gchar *name,
|
||||
GThreadFunc proxy,
|
||||
GThreadFunc func,
|
||||
gpointer data,
|
||||
gsize stack_size,
|
||||
const GThreadSchedulerSettings *scheduler_settings,
|
||||
GError **error);
|
||||
|
||||
void g_thread_get_scheduler_settings (GThreadSchedulerSettings *scheduler_settings);
|
||||
|
||||
gpointer g_thread_proxy (gpointer thread);
|
||||
|
||||
|
Reference in New Issue
Block a user