[maemo-commits] [maemo-commits] r14936 - in projects/haf/trunk/glib: glib gthread
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Mon Dec 10 14:54:05 EET 2007
- Previous message: [maemo-commits] r14935 - in projects/haf/trunk/hildon-desktop: . libhildonwm
- Next message: [maemo-commits] r14937 - in projects/haf/trunk/glib: . glib
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: xan Date: 2007-12-10 14:53:55 +0200 (Mon, 10 Dec 2007) New Revision: 14936 Modified: projects/haf/trunk/glib/glib/gthread.c projects/haf/trunk/glib/glib/gthread.h projects/haf/trunk/glib/glib/gthreadpool.c projects/haf/trunk/glib/glib/gthreadpool.h projects/haf/trunk/glib/gthread/gthread-posix.c Log: Realtime scheduling support for GThreadPools. Part of bug NB#76856 Modified: projects/haf/trunk/glib/glib/gthread.c =================================================================== --- projects/haf/trunk/glib/glib/gthread.c 2007-12-10 10:30:46 UTC (rev 14935) +++ projects/haf/trunk/glib/glib/gthread.c 2007-12-10 12:53:55 UTC (rev 14936) @@ -881,6 +881,15 @@ g_static_mutex_free (&lock->mutex); } +gboolean g_thread_set_scheduler (GThread *thread, + GThreadScheduler scheduler, + gint priority) +{ + GRealThread* real = (GRealThread*) thread; + + return G_THREAD_CF(scheduler_set, 0, (&real->system_thread, scheduler, priority)); +} + /** * g_thread_foreach * @thread_func: function to call for all GThread structures Modified: projects/haf/trunk/glib/glib/gthread.h =================================================================== --- projects/haf/trunk/glib/glib/gthread.h 2007-12-10 10:30:46 UTC (rev 14935) +++ projects/haf/trunk/glib/glib/gthread.h 2007-12-10 12:53:55 UTC (rev 14936) @@ -1,6 +1,8 @@ /* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * + * Copyright (C) 2007 Nokia Corporation + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -54,6 +56,13 @@ G_THREAD_PRIORITY_URGENT } GThreadPriority; +typedef enum +{ + G_THREAD_SCHEDULER_DEFAULT, + G_THREAD_SCHEDULER_FIFO, + G_THREAD_SCHEDULER_RR +} GThreadScheduler; + typedef struct _GThread GThread; struct _GThread { @@ -106,6 +115,11 @@ void (*thread_self) (gpointer thread); gboolean (*thread_equal) (gpointer thread1, gpointer thread2); + gint (*priority_min) (GThreadScheduler scheduler); + gint (*priority_max) (GThreadScheduler scheduler); + gboolean (*scheduler_set) (gpointer thread, + GThreadScheduler scheduler, + gint priority); }; GLIB_VAR GThreadFunctions g_thread_functions_for_glib_use; @@ -204,6 +218,13 @@ (private_key, value)) #define g_thread_yield() G_THREAD_CF (thread_yield, (void)0, ()) +#define g_thread_scheduler_get_priority_min(sched) G_THREAD_CF (priority_min, \ + 0, \ + (sched)) +#define g_thread_scheduler_get_priority_max(sched) G_THREAD_CF (priority_max, \ + 0, \ + (sched)) + #define g_thread_create(func, data, joinable, error) \ (g_thread_create_full (func, data, 0, joinable, FALSE, \ G_THREAD_PRIORITY_NORMAL, error)) @@ -221,6 +242,9 @@ void g_thread_set_priority (GThread *thread, GThreadPriority priority); +gboolean g_thread_set_scheduler (GThread *thread, + GThreadScheduler scheduler, + gint priority); /* GStaticMutexes can be statically initialized with the value * G_STATIC_MUTEX_INIT, and then they can directly be used, that is Modified: projects/haf/trunk/glib/glib/gthreadpool.c =================================================================== --- projects/haf/trunk/glib/glib/gthreadpool.c 2007-12-10 10:30:46 UTC (rev 14935) +++ projects/haf/trunk/glib/glib/gthreadpool.c 2007-12-10 12:53:55 UTC (rev 14936) @@ -4,6 +4,8 @@ * GAsyncQueue: thread pool implementation. * Copyright (C) 2000 Sebastian Wilhelmi; University of Karlsruhe * + * Copyright (C) 2007 Nokia Corporation + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -46,6 +48,8 @@ gboolean waiting; GCompareDataFunc sort_func; gpointer sort_user_data; + GThreadScheduler scheduler; + gint priority; }; /* The following is just an address to mark the wakeup order for a @@ -245,6 +249,15 @@ DEBUG_MSG (("thread %p started for pool %p.", g_thread_self (), pool)); + /* thread self-modifies the scheduler and priority + */ + if (!(pool->scheduler == G_THREAD_SCHEDULER_DEFAULT && + pool->priority == 0)) + { + if (!g_thread_set_scheduler(g_thread_self(), pool->scheduler, pool->priority)) + g_warning("g_thread_set_scheduler() failed for pool %p", pool); + } + g_async_queue_lock (pool->queue); while (TRUE) @@ -420,6 +433,20 @@ gboolean exclusive, GError **error) { + return g_thread_pool_new_with_priority(func, user_data, max_threads, + exclusive, G_THREAD_SCHEDULER_DEFAULT, + 0, error); +} + +GThreadPool* +g_thread_pool_new_with_priority (GFunc func, + gpointer user_data, + gint max_threads, + gboolean exclusive, + GThreadScheduler scheduler, + gint priority, + GError **error) +{ GRealThreadPool *retval; G_LOCK_DEFINE_STATIC (init); @@ -438,6 +465,8 @@ retval->max_threads = max_threads; retval->num_threads = 0; retval->running = TRUE; + retval->scheduler = scheduler; + retval->priority = priority; retval->sort_func = NULL; retval->sort_user_data = NULL; Modified: projects/haf/trunk/glib/glib/gthreadpool.h =================================================================== --- projects/haf/trunk/glib/glib/gthreadpool.h 2007-12-10 10:30:46 UTC (rev 14935) +++ projects/haf/trunk/glib/glib/gthreadpool.h 2007-12-10 12:53:55 UTC (rev 14936) @@ -1,6 +1,8 @@ /* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * + * Copyright (C) 2007 Nokia Corporation + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -56,6 +58,14 @@ gboolean exclusive, GError **error); +GThreadPool* g_thread_pool_new_with_priority (GFunc func, + gpointer user_data, + gint max_threads, + gboolean exclusive, + GThreadScheduler scheduler, + gint priority, + GError **error); + /* Push new data into the thread pool. This task is assigned to a thread later * (when the maximal number of threads is reached for that pool) or now * (otherwise). If necessary a new thread will be started. The function Modified: projects/haf/trunk/glib/gthread/gthread-posix.c =================================================================== --- projects/haf/trunk/glib/gthread/gthread-posix.c 2007-12-10 10:30:46 UTC (rev 14935) +++ projects/haf/trunk/glib/gthread/gthread-posix.c 2007-12-10 12:53:55 UTC (rev 14936) @@ -4,6 +4,8 @@ * gthread.c: posix thread system implementation * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe * + * Copyright (C) 2007 Nokia Corporation + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -441,6 +443,61 @@ return (pthread_equal (*(pthread_t*)thread1, *(pthread_t*)thread2) != 0); } +gint g_thread_scheduler_priority_min_posix_impl (GThreadScheduler scheduler) +{ + switch (scheduler) + { + case G_THREAD_SCHEDULER_DEFAULT: + return sched_get_priority_min(SCHED_OTHER); + case G_THREAD_SCHEDULER_FIFO: + return sched_get_priority_min(SCHED_FIFO); + case G_THREAD_SCHEDULER_RR: + return sched_get_priority_min(SCHED_RR); + default: + return 0; + } +} + +gint g_thread_scheduler_priority_max_posix_impl (GThreadScheduler scheduler) +{ + switch (scheduler) + { + case G_THREAD_SCHEDULER_DEFAULT: + return sched_get_priority_max(SCHED_OTHER); + case G_THREAD_SCHEDULER_FIFO: + return sched_get_priority_max(SCHED_FIFO); + case G_THREAD_SCHEDULER_RR: + return sched_get_priority_max(SCHED_RR); + default: + return 0; + } +} + +gboolean g_thread_scheduler_set_posix_impl (gpointer thread, + GThreadScheduler scheduler, + gint priority) +{ + int schedpol; + struct sched_param schedprio; + + switch (scheduler) + { + case G_THREAD_SCHEDULER_FIFO: + schedpol = SCHED_FIFO; + break; + case G_THREAD_SCHEDULER_RR: + schedpol = SCHED_RR; + break; + case G_THREAD_SCHEDULER_DEFAULT: + default: + schedpol = SCHED_OTHER; + } + schedprio.sched_priority = priority; + if (pthread_setschedparam(*(pthread_t *) thread, schedpol, &schedprio)) + return FALSE; + return TRUE; +} + #ifdef USE_CLOCK_GETTIME static guint64 gettime (void) @@ -478,5 +535,8 @@ g_thread_exit_posix_impl, g_thread_set_priority_posix_impl, g_thread_self_posix_impl, - g_thread_equal_posix_impl + g_thread_equal_posix_impl, + g_thread_scheduler_priority_min_posix_impl, + g_thread_scheduler_priority_max_posix_impl, + g_thread_scheduler_set_posix_impl };
- Previous message: [maemo-commits] r14935 - in projects/haf/trunk/hildon-desktop: . libhildonwm
- Next message: [maemo-commits] r14937 - in projects/haf/trunk/glib: . glib
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]