/** * g_thread_pool_push: * @pool: a #GThreadPool * @data: a new task for @pool * @error: return location for error, or %NULL * * Inserts @data into the list of tasks to be executed by @pool. * * When the number of currently running threads is lower than the * maximal allowed number of threads, a new thread is started (or * reused) with the properties given to g_thread_pool_new(). * Otherwise, @data stays in the queue until a thread in this pool * finishes its previous task and processes @data. * * @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 * created. In that case @data is simply appended to the queue of * work to do. * * Before version 2.32, this function did not return a success status. * * Returns: %TRUE on success, %FALSE if an error occurred */ gboolean g_thread_pool_push (GThreadPool *pool, gpointer data, GError **error) { GRealThreadPool *real; gboolean result; real = (GRealThreadPool*) pool; g_return_val_if_fail (real, FALSE); g_return_val_if_fail (real->running, FALSE); result = TRUE; g_async_queue_lock (real->queue); if (g_async_queue_length_unlocked (real->queue) >= 0) { /* No thread is waiting in the queue */ GError *local_error = NULL; if (!g_thread_pool_start_thread (real, &local_error)) { g_propagate_error (error, local_error); result = FALSE; } } g_thread_pool_queue_push_unlocked (real, data); g_async_queue_unlock (real->queue); return result; }
static void g_thread_pool_wakeup_and_stop_all (GRealThreadPool* pool) { guint i; g_return_if_fail (pool); g_return_if_fail (pool->running == FALSE); g_return_if_fail (pool->num_threads != 0); pool->immediate = TRUE; for (i = 0; i < pool->num_threads; i++) g_thread_pool_queue_push_unlocked (pool, GUINT_TO_POINTER (1)); }
/** * g_thread_pool_push: * @pool: a #GThreadPool * @data: a new task for @pool * @error: return location for error * * Inserts @data into the list of tasks to be executed by @pool. When * the number of currently running threads is lower than the maximal * allowed number of threads, a new thread is started (or reused) with * the properties given to g_thread_pool_new (). Otherwise @data stays * in the queue until a thread in this pool finishes its previous task * and processes @data. * * @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 * created. In that case @data is simply appended to the queue of work * to do. **/ void g_thread_pool_push (GThreadPool *pool, gpointer data, GError **error) { GRealThreadPool *real; real = (GRealThreadPool*) pool; g_return_if_fail (real); g_return_if_fail (real->running); g_async_queue_lock (real->queue); if (g_async_queue_length_unlocked (real->queue) >= 0) /* No thread is waiting in the queue */ g_thread_pool_start_thread (real, error); g_thread_pool_queue_push_unlocked (real, data); g_async_queue_unlock (real->queue); }