1
0
mirror of https://gitlab.gnome.org/GNOME/glib.git synced 2025-07-21 17:37:53 +02:00

Renamed 'value' and 'arg' to 'data' and 'thread_func' to 'func' to make it

2001-05-09  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
	'thread_func' to 'func' to make it more consistent with the rest
	of GLib.

	* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
	members of GThreadPool to the private ones. Renamed 'thread_func'
	to 'func' as above. Moved up 'user_data' in g_thead_pool_new
	argument list and in GThreadPool struct.
This commit is contained in:
Sebastian Wilhelmi
2001-05-09 12:51:21 +00:00
committed by Sebastian Wilhelmi
parent f7e009b00a
commit a8c9dadde2
16 changed files with 172 additions and 86 deletions

@@ -1,3 +1,14 @@
2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
'thread_func' to 'func' to make it more consistent with the rest
of GLib.
* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
members of GThreadPool to the private ones. Renamed 'thread_func'
to 'func' as above. Moved up 'user_data' in g_thead_pool_new
argument list and in GThreadPool struct.
Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org> Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org>
* gcompletion.h: removed #include <unistd.h> sneaked in by * gcompletion.h: removed #include <unistd.h> sneaked in by

@@ -1,3 +1,14 @@
2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
'thread_func' to 'func' to make it more consistent with the rest
of GLib.
* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
members of GThreadPool to the private ones. Renamed 'thread_func'
to 'func' as above. Moved up 'user_data' in g_thead_pool_new
argument list and in GThreadPool struct.
Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org> Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org>
* gcompletion.h: removed #include <unistd.h> sneaked in by * gcompletion.h: removed #include <unistd.h> sneaked in by

@@ -1,3 +1,14 @@
2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
'thread_func' to 'func' to make it more consistent with the rest
of GLib.
* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
members of GThreadPool to the private ones. Renamed 'thread_func'
to 'func' as above. Moved up 'user_data' in g_thead_pool_new
argument list and in GThreadPool struct.
Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org> Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org>
* gcompletion.h: removed #include <unistd.h> sneaked in by * gcompletion.h: removed #include <unistd.h> sneaked in by

@@ -1,3 +1,14 @@
2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
'thread_func' to 'func' to make it more consistent with the rest
of GLib.
* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
members of GThreadPool to the private ones. Renamed 'thread_func'
to 'func' as above. Moved up 'user_data' in g_thead_pool_new
argument list and in GThreadPool struct.
Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org> Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org>
* gcompletion.h: removed #include <unistd.h> sneaked in by * gcompletion.h: removed #include <unistd.h> sneaked in by

@@ -1,3 +1,14 @@
2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
'thread_func' to 'func' to make it more consistent with the rest
of GLib.
* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
members of GThreadPool to the private ones. Renamed 'thread_func'
to 'func' as above. Moved up 'user_data' in g_thead_pool_new
argument list and in GThreadPool struct.
Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org> Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org>
* gcompletion.h: removed #include <unistd.h> sneaked in by * gcompletion.h: removed #include <unistd.h> sneaked in by

@@ -1,3 +1,14 @@
2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
'thread_func' to 'func' to make it more consistent with the rest
of GLib.
* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
members of GThreadPool to the private ones. Renamed 'thread_func'
to 'func' as above. Moved up 'user_data' in g_thead_pool_new
argument list and in GThreadPool struct.
Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org> Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org>
* gcompletion.h: removed #include <unistd.h> sneaked in by * gcompletion.h: removed #include <unistd.h> sneaked in by

@@ -1,3 +1,14 @@
2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
'thread_func' to 'func' to make it more consistent with the rest
of GLib.
* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
members of GThreadPool to the private ones. Renamed 'thread_func'
to 'func' as above. Moved up 'user_data' in g_thead_pool_new
argument list and in GThreadPool struct.
Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org> Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org>
* gcompletion.h: removed #include <unistd.h> sneaked in by * gcompletion.h: removed #include <unistd.h> sneaked in by

@@ -1,3 +1,14 @@
2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
'thread_func' to 'func' to make it more consistent with the rest
of GLib.
* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
members of GThreadPool to the private ones. Renamed 'thread_func'
to 'func' as above. Moved up 'user_data' in g_thead_pool_new
argument list and in GThreadPool struct.
Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org> Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org>
* gcompletion.h: removed #include <unistd.h> sneaked in by * gcompletion.h: removed #include <unistd.h> sneaked in by

@@ -535,14 +535,14 @@ g_thread_create_proxy (gpointer data)
SET_PRIO (thread->pid, thread->thread.priority); SET_PRIO (thread->pid, thread->thread.priority);
#endif /* G_THREAD_USE_PID_SURROGATE */ #endif /* G_THREAD_USE_PID_SURROGATE */
thread->retval = thread->thread.func (thread->thread.arg); thread->retval = thread->thread.func (thread->thread.data);
return NULL; return NULL;
} }
GThread* GThread*
g_thread_create (GThreadFunc thread_func, g_thread_create (GThreadFunc func,
gpointer arg, gpointer data,
gulong stack_size, gulong stack_size,
gboolean joinable, gboolean joinable,
gboolean bound, gboolean bound,
@@ -551,15 +551,15 @@ g_thread_create (GThreadFunc thread_func,
{ {
GRealThread* result = g_new (GRealThread, 1); GRealThread* result = g_new (GRealThread, 1);
GError *local_error = NULL; GError *local_error = NULL;
g_return_val_if_fail (thread_func, NULL); g_return_val_if_fail (func, NULL);
g_return_val_if_fail (priority >= G_THREAD_PRIORITY_LOW, NULL); g_return_val_if_fail (priority >= G_THREAD_PRIORITY_LOW, NULL);
g_return_val_if_fail (priority <= G_THREAD_PRIORITY_URGENT, NULL); g_return_val_if_fail (priority <= G_THREAD_PRIORITY_URGENT, NULL);
result->thread.joinable = joinable; result->thread.joinable = joinable;
result->thread.bound = bound; result->thread.bound = bound;
result->thread.priority = priority; result->thread.priority = priority;
result->thread.func = thread_func; result->thread.func = func;
result->thread.arg = arg; result->thread.data = data;
result->private_data = NULL; result->private_data = NULL;
result->context = NULL; result->context = NULL;
G_LOCK (g_thread); G_LOCK (g_thread);
@@ -657,7 +657,7 @@ g_thread_self (void)
thread->thread.priority = G_THREAD_PRIORITY_NORMAL; /* This is thread->thread.priority = G_THREAD_PRIORITY_NORMAL; /* This is
just a guess */ just a guess */
thread->thread.func = NULL; thread->thread.func = NULL;
thread->thread.arg = NULL; thread->thread.data = NULL;
thread->private_data = NULL; thread->private_data = NULL;
thread->context = NULL; thread->context = NULL;

@@ -43,7 +43,7 @@ typedef enum
G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */ G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */
} GThreadError; } GThreadError;
typedef gpointer (*GThreadFunc) (gpointer value); typedef gpointer (*GThreadFunc) (gpointer data);
typedef enum typedef enum
{ {
@@ -56,11 +56,11 @@ typedef enum
typedef struct _GThread GThread; typedef struct _GThread GThread;
struct _GThread struct _GThread
{ {
GThreadFunc func;
gpointer data;
gboolean joinable; gboolean joinable;
gboolean bound; gboolean bound;
GThreadPriority priority; GThreadPriority priority;
GThreadFunc func;
gpointer arg;
}; };
typedef struct _GMutex GMutex; typedef struct _GMutex GMutex;
@@ -89,8 +89,8 @@ struct _GThreadFunctions
gpointer (*private_get) (GPrivate *private_key); gpointer (*private_get) (GPrivate *private_key);
void (*private_set) (GPrivate *private_key, void (*private_set) (GPrivate *private_key,
gpointer data); gpointer data);
void (*thread_create) (GThreadFunc thread_func, void (*thread_create) (GThreadFunc func,
gpointer arg, gpointer data,
gulong stack_size, gulong stack_size,
gboolean joinable, gboolean joinable,
gboolean bound, gboolean bound,
@@ -194,8 +194,8 @@ GMutex* g_static_mutex_get_mutex_impl (GMutex **mutex);
(private_key, value)) (private_key, value))
#define g_thread_yield() G_THREAD_CF (thread_yield, (void)0, ()) #define g_thread_yield() G_THREAD_CF (thread_yield, (void)0, ())
GThread* g_thread_create (GThreadFunc thread_func, GThread* g_thread_create (GThreadFunc func,
gpointer arg, gpointer data,
gulong stack_size, gulong stack_size,
gboolean joinable, gboolean joinable,
gboolean bound, gboolean bound,

@@ -31,6 +31,7 @@ typedef struct _GRealThreadPool GRealThreadPool;
struct _GRealThreadPool struct _GRealThreadPool
{ {
GThreadPool pool; GThreadPool pool;
gulong stack_size;
GAsyncQueue* queue; GAsyncQueue* queue;
gint max_threads; gint max_threads;
gint num_threads; gint num_threads;
@@ -73,7 +74,7 @@ g_thread_pool_thread_proxy (gpointer data)
{ {
gpointer task; gpointer task;
gboolean goto_global_pool = gboolean goto_global_pool =
!pool->pool.exclusive && pool->pool.stack_size == 0; !pool->pool.exclusive && pool->stack_size == 0;
gint len = g_async_queue_length_unlocked (pool->queue); gint len = g_async_queue_length_unlocked (pool->queue);
if (g_thread_should_run (pool, len)) if (g_thread_should_run (pool, len))
@@ -116,7 +117,7 @@ g_thread_pool_thread_proxy (gpointer data)
else if (pool->running || !pool->immediate) else if (pool->running || !pool->immediate)
{ {
g_async_queue_unlock (pool->queue); g_async_queue_unlock (pool->queue);
pool->pool.thread_func (task, pool->pool.user_data); pool->pool.func (task, pool->pool.user_data);
g_async_queue_lock (pool->queue); g_async_queue_lock (pool->queue);
} }
} }
@@ -170,7 +171,7 @@ g_thread_pool_thread_proxy (gpointer data)
G_LOCK (unused_threads); G_LOCK (unused_threads);
if ((unused_threads >= max_unused_threads && if ((unused_threads >= max_unused_threads &&
max_unused_threads != -1) || pool->pool.stack_size != 0) max_unused_threads != -1) || pool->stack_size != 0)
{ {
G_UNLOCK (unused_threads); G_UNLOCK (unused_threads);
g_async_queue_unlock (unused_queue); g_async_queue_unlock (unused_queue);
@@ -234,7 +235,7 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
GError *local_error = NULL; GError *local_error = NULL;
/* No thread was found, we have to start a new one */ /* No thread was found, we have to start a new one */
g_thread_create (g_thread_pool_thread_proxy, pool, g_thread_create (g_thread_pool_thread_proxy, pool,
pool->pool.stack_size, FALSE, pool->stack_size, FALSE,
bound, priority, &local_error); bound, priority, &local_error);
if (local_error) if (local_error)
@@ -251,7 +252,9 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
/** /**
* g_thread_pool_new: * g_thread_pool_new:
* @thread_func: a function to execute in the threads of the new thread pool * @func: a function to execute in the threads of the new thread pool
* @user_data: user data that is handed over to @func every time it
* is called
* @max_threads: the maximal number of threads to execute concurrently in * @max_threads: the maximal number of threads to execute concurrently in
* the new thread pool, -1 means no limit * the new thread pool, -1 means no limit
* @stack_size: the stack size for the threads of the new thread pool, * @stack_size: the stack size for the threads of the new thread pool,
@@ -259,8 +262,6 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
* @bound: should the threads of the new thread pool be bound? * @bound: should the threads of the new thread pool be bound?
* @priority: a priority for the threads of the new thread pool * @priority: a priority for the threads of the new thread pool
* @exclusive: should this thread pool be exclusive? * @exclusive: should this thread pool be exclusive?
* @user_data: user data that is handed over to @thread_func every time it
* is called
* @error: return location for error * @error: return location for error
* *
* This function creates a new thread pool. All threads created within * This function creates a new thread pool. All threads created within
@@ -272,9 +273,9 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
* created or an unused one is reused. At most @max_threads threads * created or an unused one is reused. At most @max_threads threads
* are running concurrently for this thread pool. @max_threads = -1 * are running concurrently for this thread pool. @max_threads = -1
* allows unlimited threads to be created for this thread pool. The * allows unlimited threads to be created for this thread pool. The
* newly created or reused thread now executes the function * newly created or reused thread now executes the function @func with
* @thread_func with the two arguments. The first one is the parameter * the two arguments. The first one is the parameter to
* to g_thread_pool_push() and the second one is @user_data. * g_thread_pool_push() and the second one is @user_data.
* *
* The parameter @exclusive determines, whether the thread pool owns * The parameter @exclusive determines, whether the thread pool owns
* all threads exclusive or whether the threads are shared * all threads exclusive or whether the threads are shared
@@ -298,31 +299,31 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
* Return value: the new #GThreadPool * Return value: the new #GThreadPool
**/ **/
GThreadPool* GThreadPool*
g_thread_pool_new (GFunc thread_func, g_thread_pool_new (GFunc func,
gpointer user_data,
gint max_threads, gint max_threads,
gulong stack_size, gulong stack_size,
gboolean bound, gboolean bound,
GThreadPriority priority, GThreadPriority priority,
gboolean exclusive, gboolean exclusive,
gpointer user_data,
GError **error) GError **error)
{ {
GRealThreadPool *retval; GRealThreadPool *retval;
G_LOCK_DEFINE_STATIC (init); G_LOCK_DEFINE_STATIC (init);
g_return_val_if_fail (thread_func, NULL); g_return_val_if_fail (func, NULL);
g_return_val_if_fail (!exclusive || max_threads != -1, NULL); g_return_val_if_fail (!exclusive || max_threads != -1, NULL);
g_return_val_if_fail (max_threads >= -1, NULL); g_return_val_if_fail (max_threads >= -1, NULL);
g_return_val_if_fail (g_thread_supported (), NULL); g_return_val_if_fail (g_thread_supported (), NULL);
retval = g_new (GRealThreadPool, 1); retval = g_new (GRealThreadPool, 1);
retval->pool.thread_func = thread_func; retval->pool.func = func;
retval->pool.stack_size = stack_size; retval->pool.user_data = user_data;
retval->pool.bound = bound; retval->pool.bound = bound;
retval->pool.priority = priority; retval->pool.priority = priority;
retval->pool.exclusive = exclusive; retval->pool.exclusive = exclusive;
retval->pool.user_data = user_data; retval->stack_size = stack_size;
retval->queue = g_async_queue_new (); retval->queue = g_async_queue_new ();
retval->max_threads = max_threads; retval->max_threads = max_threads;
retval->num_threads = 0; retval->num_threads = 0;
@@ -421,12 +422,11 @@ g_thread_pool_push (GThreadPool *pool,
* effectively frozen until @max_threads is set to a non-zero value * effectively frozen until @max_threads is set to a non-zero value
* again. * again.
* *
* A thread is never terminated while calling @thread_func, as * A thread is never terminated while calling @func, as supplied by
* supplied by g_thread_pool_new (). Instead the maximal number of * g_thread_pool_new (). Instead the maximal number of threads only
* threads only has effect for the allocation of new threads in * has effect for the allocation of new threads in g_thread_pool_push
* g_thread_pool_push (). A new thread is allocated, whenever the * (). A new thread is allocated, whenever the number of currently
* number of currently running threads in @pool is smaller than the * running threads in @pool is smaller than the maximal number.
* maximal number.
* *
* @error can be NULL to ignore errors, or non-NULL to report * @error can be NULL to ignore errors, or non-NULL to report
* errors. An error can only occur, when a new thread couldn't be * errors. An error can only occur, when a new thread couldn't be

@@ -40,26 +40,25 @@ typedef struct _GThreadPool GThreadPool;
* pool with the constructor function */ * pool with the constructor function */
struct _GThreadPool struct _GThreadPool
{ {
GFunc thread_func; GFunc func;
gulong stack_size; gpointer user_data;
gboolean bound; gboolean bound;
GThreadPriority priority; GThreadPriority priority;
gboolean exclusive; gboolean exclusive;
gpointer user_data;
}; };
/* Get a thread pool with the function thread_func, at most max_threads may /* Get a thread pool with the function func, at most max_threads may
* run at a time (max_threads == -1 means no limit), stack_size, bound, * run at a time (max_threads == -1 means no limit), stack_size, bound,
* priority like in g_thread_create, exclusive == TRUE means, that the threads * priority like in g_thread_create, exclusive == TRUE means, that the threads
* shouldn't be shared and that they will be prestarted (otherwise they are * shouldn't be shared and that they will be prestarted (otherwise they are
* started, as needed) user_data is the 2nd argument to the thread_func */ * started as needed) user_data is the 2nd argument to the func */
GThreadPool* g_thread_pool_new (GFunc thread_func, GThreadPool* g_thread_pool_new (GFunc func,
gpointer user_data,
gint max_threads, gint max_threads,
gulong stack_size, gulong stack_size,
gboolean bound, gboolean bound,
GThreadPriority priority, GThreadPriority priority,
gboolean exclusive, gboolean exclusive,
gpointer user_data,
GError **error); GError **error);
/* Push new data into the thread pool. This task is assigned to a thread later /* Push new data into the thread pool. This task is assigned to a thread later

@@ -535,14 +535,14 @@ g_thread_create_proxy (gpointer data)
SET_PRIO (thread->pid, thread->thread.priority); SET_PRIO (thread->pid, thread->thread.priority);
#endif /* G_THREAD_USE_PID_SURROGATE */ #endif /* G_THREAD_USE_PID_SURROGATE */
thread->retval = thread->thread.func (thread->thread.arg); thread->retval = thread->thread.func (thread->thread.data);
return NULL; return NULL;
} }
GThread* GThread*
g_thread_create (GThreadFunc thread_func, g_thread_create (GThreadFunc func,
gpointer arg, gpointer data,
gulong stack_size, gulong stack_size,
gboolean joinable, gboolean joinable,
gboolean bound, gboolean bound,
@@ -551,15 +551,15 @@ g_thread_create (GThreadFunc thread_func,
{ {
GRealThread* result = g_new (GRealThread, 1); GRealThread* result = g_new (GRealThread, 1);
GError *local_error = NULL; GError *local_error = NULL;
g_return_val_if_fail (thread_func, NULL); g_return_val_if_fail (func, NULL);
g_return_val_if_fail (priority >= G_THREAD_PRIORITY_LOW, NULL); g_return_val_if_fail (priority >= G_THREAD_PRIORITY_LOW, NULL);
g_return_val_if_fail (priority <= G_THREAD_PRIORITY_URGENT, NULL); g_return_val_if_fail (priority <= G_THREAD_PRIORITY_URGENT, NULL);
result->thread.joinable = joinable; result->thread.joinable = joinable;
result->thread.bound = bound; result->thread.bound = bound;
result->thread.priority = priority; result->thread.priority = priority;
result->thread.func = thread_func; result->thread.func = func;
result->thread.arg = arg; result->thread.data = data;
result->private_data = NULL; result->private_data = NULL;
result->context = NULL; result->context = NULL;
G_LOCK (g_thread); G_LOCK (g_thread);
@@ -657,7 +657,7 @@ g_thread_self (void)
thread->thread.priority = G_THREAD_PRIORITY_NORMAL; /* This is thread->thread.priority = G_THREAD_PRIORITY_NORMAL; /* This is
just a guess */ just a guess */
thread->thread.func = NULL; thread->thread.func = NULL;
thread->thread.arg = NULL; thread->thread.data = NULL;
thread->private_data = NULL; thread->private_data = NULL;
thread->context = NULL; thread->context = NULL;

@@ -43,7 +43,7 @@ typedef enum
G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */ G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */
} GThreadError; } GThreadError;
typedef gpointer (*GThreadFunc) (gpointer value); typedef gpointer (*GThreadFunc) (gpointer data);
typedef enum typedef enum
{ {
@@ -56,11 +56,11 @@ typedef enum
typedef struct _GThread GThread; typedef struct _GThread GThread;
struct _GThread struct _GThread
{ {
GThreadFunc func;
gpointer data;
gboolean joinable; gboolean joinable;
gboolean bound; gboolean bound;
GThreadPriority priority; GThreadPriority priority;
GThreadFunc func;
gpointer arg;
}; };
typedef struct _GMutex GMutex; typedef struct _GMutex GMutex;
@@ -89,8 +89,8 @@ struct _GThreadFunctions
gpointer (*private_get) (GPrivate *private_key); gpointer (*private_get) (GPrivate *private_key);
void (*private_set) (GPrivate *private_key, void (*private_set) (GPrivate *private_key,
gpointer data); gpointer data);
void (*thread_create) (GThreadFunc thread_func, void (*thread_create) (GThreadFunc func,
gpointer arg, gpointer data,
gulong stack_size, gulong stack_size,
gboolean joinable, gboolean joinable,
gboolean bound, gboolean bound,
@@ -194,8 +194,8 @@ GMutex* g_static_mutex_get_mutex_impl (GMutex **mutex);
(private_key, value)) (private_key, value))
#define g_thread_yield() G_THREAD_CF (thread_yield, (void)0, ()) #define g_thread_yield() G_THREAD_CF (thread_yield, (void)0, ())
GThread* g_thread_create (GThreadFunc thread_func, GThread* g_thread_create (GThreadFunc func,
gpointer arg, gpointer data,
gulong stack_size, gulong stack_size,
gboolean joinable, gboolean joinable,
gboolean bound, gboolean bound,

@@ -31,6 +31,7 @@ typedef struct _GRealThreadPool GRealThreadPool;
struct _GRealThreadPool struct _GRealThreadPool
{ {
GThreadPool pool; GThreadPool pool;
gulong stack_size;
GAsyncQueue* queue; GAsyncQueue* queue;
gint max_threads; gint max_threads;
gint num_threads; gint num_threads;
@@ -73,7 +74,7 @@ g_thread_pool_thread_proxy (gpointer data)
{ {
gpointer task; gpointer task;
gboolean goto_global_pool = gboolean goto_global_pool =
!pool->pool.exclusive && pool->pool.stack_size == 0; !pool->pool.exclusive && pool->stack_size == 0;
gint len = g_async_queue_length_unlocked (pool->queue); gint len = g_async_queue_length_unlocked (pool->queue);
if (g_thread_should_run (pool, len)) if (g_thread_should_run (pool, len))
@@ -116,7 +117,7 @@ g_thread_pool_thread_proxy (gpointer data)
else if (pool->running || !pool->immediate) else if (pool->running || !pool->immediate)
{ {
g_async_queue_unlock (pool->queue); g_async_queue_unlock (pool->queue);
pool->pool.thread_func (task, pool->pool.user_data); pool->pool.func (task, pool->pool.user_data);
g_async_queue_lock (pool->queue); g_async_queue_lock (pool->queue);
} }
} }
@@ -170,7 +171,7 @@ g_thread_pool_thread_proxy (gpointer data)
G_LOCK (unused_threads); G_LOCK (unused_threads);
if ((unused_threads >= max_unused_threads && if ((unused_threads >= max_unused_threads &&
max_unused_threads != -1) || pool->pool.stack_size != 0) max_unused_threads != -1) || pool->stack_size != 0)
{ {
G_UNLOCK (unused_threads); G_UNLOCK (unused_threads);
g_async_queue_unlock (unused_queue); g_async_queue_unlock (unused_queue);
@@ -234,7 +235,7 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
GError *local_error = NULL; GError *local_error = NULL;
/* No thread was found, we have to start a new one */ /* No thread was found, we have to start a new one */
g_thread_create (g_thread_pool_thread_proxy, pool, g_thread_create (g_thread_pool_thread_proxy, pool,
pool->pool.stack_size, FALSE, pool->stack_size, FALSE,
bound, priority, &local_error); bound, priority, &local_error);
if (local_error) if (local_error)
@@ -251,7 +252,9 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
/** /**
* g_thread_pool_new: * g_thread_pool_new:
* @thread_func: a function to execute in the threads of the new thread pool * @func: a function to execute in the threads of the new thread pool
* @user_data: user data that is handed over to @func every time it
* is called
* @max_threads: the maximal number of threads to execute concurrently in * @max_threads: the maximal number of threads to execute concurrently in
* the new thread pool, -1 means no limit * the new thread pool, -1 means no limit
* @stack_size: the stack size for the threads of the new thread pool, * @stack_size: the stack size for the threads of the new thread pool,
@@ -259,8 +262,6 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
* @bound: should the threads of the new thread pool be bound? * @bound: should the threads of the new thread pool be bound?
* @priority: a priority for the threads of the new thread pool * @priority: a priority for the threads of the new thread pool
* @exclusive: should this thread pool be exclusive? * @exclusive: should this thread pool be exclusive?
* @user_data: user data that is handed over to @thread_func every time it
* is called
* @error: return location for error * @error: return location for error
* *
* This function creates a new thread pool. All threads created within * This function creates a new thread pool. All threads created within
@@ -272,9 +273,9 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
* created or an unused one is reused. At most @max_threads threads * created or an unused one is reused. At most @max_threads threads
* are running concurrently for this thread pool. @max_threads = -1 * are running concurrently for this thread pool. @max_threads = -1
* allows unlimited threads to be created for this thread pool. The * allows unlimited threads to be created for this thread pool. The
* newly created or reused thread now executes the function * newly created or reused thread now executes the function @func with
* @thread_func with the two arguments. The first one is the parameter * the two arguments. The first one is the parameter to
* to g_thread_pool_push() and the second one is @user_data. * g_thread_pool_push() and the second one is @user_data.
* *
* The parameter @exclusive determines, whether the thread pool owns * The parameter @exclusive determines, whether the thread pool owns
* all threads exclusive or whether the threads are shared * all threads exclusive or whether the threads are shared
@@ -298,31 +299,31 @@ g_thread_pool_start_thread (GRealThreadPool *pool,
* Return value: the new #GThreadPool * Return value: the new #GThreadPool
**/ **/
GThreadPool* GThreadPool*
g_thread_pool_new (GFunc thread_func, g_thread_pool_new (GFunc func,
gpointer user_data,
gint max_threads, gint max_threads,
gulong stack_size, gulong stack_size,
gboolean bound, gboolean bound,
GThreadPriority priority, GThreadPriority priority,
gboolean exclusive, gboolean exclusive,
gpointer user_data,
GError **error) GError **error)
{ {
GRealThreadPool *retval; GRealThreadPool *retval;
G_LOCK_DEFINE_STATIC (init); G_LOCK_DEFINE_STATIC (init);
g_return_val_if_fail (thread_func, NULL); g_return_val_if_fail (func, NULL);
g_return_val_if_fail (!exclusive || max_threads != -1, NULL); g_return_val_if_fail (!exclusive || max_threads != -1, NULL);
g_return_val_if_fail (max_threads >= -1, NULL); g_return_val_if_fail (max_threads >= -1, NULL);
g_return_val_if_fail (g_thread_supported (), NULL); g_return_val_if_fail (g_thread_supported (), NULL);
retval = g_new (GRealThreadPool, 1); retval = g_new (GRealThreadPool, 1);
retval->pool.thread_func = thread_func; retval->pool.func = func;
retval->pool.stack_size = stack_size; retval->pool.user_data = user_data;
retval->pool.bound = bound; retval->pool.bound = bound;
retval->pool.priority = priority; retval->pool.priority = priority;
retval->pool.exclusive = exclusive; retval->pool.exclusive = exclusive;
retval->pool.user_data = user_data; retval->stack_size = stack_size;
retval->queue = g_async_queue_new (); retval->queue = g_async_queue_new ();
retval->max_threads = max_threads; retval->max_threads = max_threads;
retval->num_threads = 0; retval->num_threads = 0;
@@ -421,12 +422,11 @@ g_thread_pool_push (GThreadPool *pool,
* effectively frozen until @max_threads is set to a non-zero value * effectively frozen until @max_threads is set to a non-zero value
* again. * again.
* *
* A thread is never terminated while calling @thread_func, as * A thread is never terminated while calling @func, as supplied by
* supplied by g_thread_pool_new (). Instead the maximal number of * g_thread_pool_new (). Instead the maximal number of threads only
* threads only has effect for the allocation of new threads in * has effect for the allocation of new threads in g_thread_pool_push
* g_thread_pool_push (). A new thread is allocated, whenever the * (). A new thread is allocated, whenever the number of currently
* number of currently running threads in @pool is smaller than the * running threads in @pool is smaller than the maximal number.
* maximal number.
* *
* @error can be NULL to ignore errors, or non-NULL to report * @error can be NULL to ignore errors, or non-NULL to report
* errors. An error can only occur, when a new thread couldn't be * errors. An error can only occur, when a new thread couldn't be

@@ -40,26 +40,25 @@ typedef struct _GThreadPool GThreadPool;
* pool with the constructor function */ * pool with the constructor function */
struct _GThreadPool struct _GThreadPool
{ {
GFunc thread_func; GFunc func;
gulong stack_size; gpointer user_data;
gboolean bound; gboolean bound;
GThreadPriority priority; GThreadPriority priority;
gboolean exclusive; gboolean exclusive;
gpointer user_data;
}; };
/* Get a thread pool with the function thread_func, at most max_threads may /* Get a thread pool with the function func, at most max_threads may
* run at a time (max_threads == -1 means no limit), stack_size, bound, * run at a time (max_threads == -1 means no limit), stack_size, bound,
* priority like in g_thread_create, exclusive == TRUE means, that the threads * priority like in g_thread_create, exclusive == TRUE means, that the threads
* shouldn't be shared and that they will be prestarted (otherwise they are * shouldn't be shared and that they will be prestarted (otherwise they are
* started, as needed) user_data is the 2nd argument to the thread_func */ * started as needed) user_data is the 2nd argument to the func */
GThreadPool* g_thread_pool_new (GFunc thread_func, GThreadPool* g_thread_pool_new (GFunc func,
gpointer user_data,
gint max_threads, gint max_threads,
gulong stack_size, gulong stack_size,
gboolean bound, gboolean bound,
GThreadPriority priority, GThreadPriority priority,
gboolean exclusive, gboolean exclusive,
gpointer user_data,
GError **error); GError **error);
/* Push new data into the thread pool. This task is assigned to a thread later /* Push new data into the thread pool. This task is assigned to a thread later