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:
committed by
Sebastian Wilhelmi
parent
f7e009b00a
commit
a8c9dadde2
11
ChangeLog
11
ChangeLog
@@ -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
|
||||||
|
14
gthread.c
14
gthread.c
@@ -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;
|
||||||
|
|
||||||
|
14
gthread.h
14
gthread.h
@@ -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
|
||||||
|
Reference in New Issue
Block a user