/* GLIB - Library of useful routines for C programming
 * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * GAsyncQueue: thread pool implementation.
 * Copyright (C) 2000 Sebastian Wilhelmi; University of Karlsruhe
 *
 * 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
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/*
 * MT safe
 */

#include "config.h"

#include "glib.h"
#include "galias.h"

#define DEBUG_MSG(x)
/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n");  */

typedef struct _GRealThreadPool GRealThreadPool;

struct _GRealThreadPool
{
  GThreadPool pool;
  GAsyncQueue* queue;
  gint max_threads;
  gint num_threads;
  gboolean running;
  gboolean immediate;
  gboolean waiting;
  GCompareDataFunc sort_func;
  gpointer sort_user_data;
};

/* The following is just an address to mark the wakeup order for a
 * thread, it could be any address (as long, as it isn't a valid
 * GThreadPool address) */
static const gpointer wakeup_thread_marker = (gpointer) &g_thread_pool_new;
static gint wakeup_thread_serial = 0;

/* Here all unused threads are waiting  */
static GAsyncQueue *unused_thread_queue;
static gint unused_threads = 0;
static gint max_unused_threads = 0;
static guint max_idle_time = 0;

static GMutex *inform_mutex = NULL;
static GCond *inform_cond = NULL;


static void     g_thread_pool_queue_push_unlocked (GRealThreadPool  *pool,
						   gpointer          data);
static void     g_thread_pool_free_internal       (GRealThreadPool  *pool);
static gpointer g_thread_pool_thread_proxy        (gpointer          data);
static void     g_thread_pool_start_thread        (GRealThreadPool  *pool,
						   GError          **error);
static void     g_thread_pool_wakeup_and_stop_all (GRealThreadPool  *pool);


static void
g_thread_pool_queue_push_unlocked (GRealThreadPool *pool,
				   gpointer         data)
{
  if (pool->sort_func) 
    g_async_queue_push_sorted_unlocked (pool->queue, 
					data,
					pool->sort_func, 
					pool->sort_user_data);
  else
    g_async_queue_push_unlocked (pool->queue, data);
}

static gpointer 
g_thread_pool_thread_proxy (gpointer data)
{
  GRealThreadPool *pool = data;
  guint last_wakeup_thread_serial = 0;

  DEBUG_MSG (("thread %p started for pool %p.", 
	      g_thread_self (), pool));

  g_async_queue_lock (pool->queue);
  while (TRUE)
    {
      gpointer task = NULL; 

      if (pool->running || (!pool->immediate && 
			    g_async_queue_length_unlocked (pool->queue) > 0))
	{
	  /* This thread pool is still active. */
	  if (pool->num_threads > pool->max_threads && 
	      pool->max_threads != -1)
	    {
	      /* This is a superfluous thread, so it goes to the
	       * global pool. */
	      DEBUG_MSG (("superfluous thread %p in pool %p.", 
			  g_thread_self (), pool));
	    }
	  else if (pool->pool.exclusive)
	    {
	      /* Exclusive threads stay attached to the pool. */
	      task = g_async_queue_pop_unlocked (pool->queue);
	      DEBUG_MSG (("thread %p in exclusive pool %p waits for task "
			  "(%d running, %d unprocessed).", 
			  g_thread_self (), pool, pool->num_threads,
			  g_async_queue_length_unlocked (pool->queue)));
	    }
	  else
	    {
	      /* A thread will wait for new tasks for at most 1/2
	       * second before going to the global pool. */
	      GTimeVal end_time;
	      g_get_current_time (&end_time);
	      g_time_val_add (&end_time, G_USEC_PER_SEC / 2); /* 1/2 second */
	      DEBUG_MSG (("thread %p in pool %p waits 1/2 second for task "
			  "(%d running, %d unprocessed).", 
			  g_thread_self (), pool, pool->num_threads,
			  g_async_queue_length_unlocked (pool->queue)));
	      task = g_async_queue_timed_pop_unlocked (pool->queue, &end_time);
	    }
	}
      else
	{
	  /* This thread pool should is inactive, it will no longer
	   * process tasks. */
	  DEBUG_MSG (("pool %p not active, thread %p will go to global pool "
		      "(running: %s, immediate: %s, len: %d).", 
		      pool, g_thread_self (), 
		      pool->running ? "true" : "false", 
		      pool->immediate ? "true" : "false",
		      g_async_queue_length_unlocked (pool->queue)));
	}
      
      if (task)
	{
	  if (pool->running || !pool->immediate)
	    {
	      /* A task was received and the thread pool is active, so
	       * execute the function. */
	      g_async_queue_unlock (pool->queue);
	      DEBUG_MSG (("thread %p in pool %p calling func.", 
			  g_thread_self (), pool));
	      pool->pool.func (task, pool->pool.user_data);
	      g_async_queue_lock (pool->queue);
	    }
	}
      else
	{
	  /* No task was received, so this thread goes to the global
	   * pool. */
	  gboolean free_pool = FALSE;
 
	  DEBUG_MSG (("thread %p leaving pool %p for global pool.", 
		      g_thread_self (), pool));
	  pool->num_threads--;

	  if (!pool->running)
	    {
	      if (!pool->waiting)
		{
		  if (pool->num_threads == 0)
		    {
		      /* If the pool is not running and no other
		       * thread is waiting for this thread pool to
		       * finish and this is the last thread of this
		       * pool, free the pool. */
		      free_pool = TRUE;
		    }		
		  else 
		    {
		      /* If the pool is not running and no other
		       * thread is waiting for this thread pool to
		       * finish and this is not the last thread of
		       * this pool and there are no tasks left in the
		       * queue, wakeup the remaining threads. */
		      if (g_async_queue_length_unlocked (pool->queue) == 
			  - pool->num_threads)
			g_thread_pool_wakeup_and_stop_all (pool);
		    }
		}
	      else if (pool->immediate || 
		       g_async_queue_length_unlocked (pool->queue) <= 0)
		{
		  /* If the pool is not running and another thread is
		   * waiting for this thread pool to finish and there
		   * are either no tasks left or the pool shall stop
		   * immediatly, inform the waiting thread of a change
		   * of the thread pool state. */
		  g_cond_broadcast (inform_cond);
		}
	    }
	  g_async_queue_unlock (pool->queue);

	  if (free_pool)
	    g_thread_pool_free_internal (pool);
	  
	  g_async_queue_lock (unused_thread_queue);
	  unused_threads++;

	  do
	    {
	      
	      if ((unused_threads >= max_unused_threads &&
		   max_unused_threads != -1))
		{
		  /* If this is a superflous thread, stop it. */
		  unused_threads--;
		  g_async_queue_unlock (unused_thread_queue);
		  DEBUG_MSG (("stopping thread %p.", g_thread_self ()));
		  return NULL;      
		}
	      
	      if (max_idle_time > 0)
		{
		  /* If a maximal idle time is given, wait for the
		   * given time. */
		  GTimeVal end_time;
		  g_get_current_time (&end_time);
		  g_time_val_add (&end_time, max_idle_time * 1000);
		  
		  DEBUG_MSG (("thread %p waiting in global pool for "
			      "%f seconds.",
			      g_thread_self (), max_idle_time / 1000.0));
		  
		  pool = g_async_queue_timed_pop_unlocked (unused_thread_queue,
							   &end_time);
		  if (!pool)
		    {
		      /* If no new task was received in the given
		       * time, stop this thread. */
		      unused_threads--;
		      g_async_queue_unlock (unused_thread_queue);
		      DEBUG_MSG (("stopping thread %p after max-idle-time.", 
				  g_thread_self ()));
		      /* Stop this thread */
		      return NULL;      
		    }
		}
	      else
		{
		  /* If no maximal idle time is given, wait
		   * indefinitly. */
		  DEBUG_MSG (("thread %p waiting in global pool.", 
			      g_thread_self ()));
		  pool = g_async_queue_pop_unlocked (unused_thread_queue);
		}
	      
	      if (pool == wakeup_thread_marker)
		{
		  if (last_wakeup_thread_serial == wakeup_thread_serial)
		    {
		      /* If this wakeup marker has been received for
		       * the second time, relay it. */
		      DEBUG_MSG (("thread %p relaying wakeup message to "
				  "waiting thread with lower serial.", 
				  g_thread_self ()));
		      g_async_queue_push_unlocked (unused_thread_queue, 
						   wakeup_thread_marker);
		    }
		  else
		    {
		      last_wakeup_thread_serial = wakeup_thread_serial;
		    }
	
		  /* If a wakeup marker has been received, this thread
		   * will get out of the way for 100 microseconds to
		   * avoid receiving this marker again. */
		  g_async_queue_unlock (unused_thread_queue);
		  g_usleep (100);
		  g_async_queue_lock (unused_thread_queue);
		}

	    } while (pool == wakeup_thread_marker);
	    
	  unused_threads--;
	  g_async_queue_unlock (unused_thread_queue);
	      
	  g_async_queue_lock (pool->queue);
	  
	  DEBUG_MSG (("thread %p entering pool %p from global pool.", 
		      g_thread_self (), pool));

	  /* pool->num_threads++ is not done here, but in
           * g_thread_pool_start_thread to make the new started thread
           * known to the pool, before itself can do it. */
	}
    }
  return NULL;
}

static void
g_thread_pool_start_thread (GRealThreadPool  *pool, 
			    GError          **error)
{
  gboolean success = FALSE;
  
  if (pool->num_threads >= pool->max_threads && pool->max_threads != -1)
    /* Enough threads are already running */
    return;

  g_async_queue_lock (unused_thread_queue);

  if (g_async_queue_length_unlocked (unused_thread_queue) < 0)
    {
      g_async_queue_push_unlocked (unused_thread_queue, pool);
      success = TRUE;
    }

  g_async_queue_unlock (unused_thread_queue);

  if (!success)
    {
      GError *local_error = NULL;
      /* No thread was found, we have to start a new one */
      g_thread_create (g_thread_pool_thread_proxy, pool, FALSE, &local_error);
      
      if (local_error)
	{
	  g_propagate_error (error, local_error);
	  return;
	}
    }

  /* See comment in g_thread_pool_thread_proxy as to why this is done
   * here and not there */
  pool->num_threads++;
}

/**
 * g_thread_pool_new: 
 * @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 
 *   the new thread pool, -1 means no limit
 * @exclusive: should this thread pool be exclusive?
 * @error: return location for error
 *
 * This function creates a new thread pool.
 *
 * Whenever you call g_thread_pool_push(), either a new thread is
 * created or an unused one is reused. At most @max_threads threads
 * are running concurrently for this thread pool. @max_threads = -1
 * allows unlimited threads to be created for this thread pool. The
 * newly created or reused thread now executes the function @func with
 * the two arguments. The first one is the parameter to
 * g_thread_pool_push() and the second one is @user_data.
 *
 * The parameter @exclusive determines, whether the thread pool owns
 * all threads exclusive or whether the threads are shared
 * globally. If @exclusive is %TRUE, @max_threads threads are started
 * immediately and they will run exclusively for this thread pool until
 * it is destroyed by g_thread_pool_free(). If @exclusive is %FALSE,
 * threads are created, when needed and shared between all
 * non-exclusive thread pools. This implies that @max_threads may not
 * be -1 for exclusive thread pools.
 *
 * @error can be %NULL to ignore errors, or non-%NULL to report
 * errors. An error can only occur when @exclusive is set to %TRUE and
 * not all @max_threads threads could be created.
 *
 * Return value: the new #GThreadPool
 **/
GThreadPool* 
g_thread_pool_new (GFunc            func,
		   gpointer         user_data,
		   gint             max_threads,
		   gboolean         exclusive,
		   GError         **error)
{
  GRealThreadPool *retval;
  G_LOCK_DEFINE_STATIC (init);

  g_return_val_if_fail (func, 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 (g_thread_supported (), NULL);

  retval = g_new (GRealThreadPool, 1);

  retval->pool.func = func;
  retval->pool.user_data = user_data;
  retval->pool.exclusive = exclusive;
  retval->queue = g_async_queue_new ();
  retval->max_threads = max_threads;
  retval->num_threads = 0;
  retval->running = TRUE;
  retval->sort_func = NULL;
  retval->sort_user_data = NULL;

  G_LOCK (init);
  
  if (!inform_mutex)
    {
      inform_mutex = g_mutex_new ();
      inform_cond = g_cond_new ();
      unused_thread_queue = g_async_queue_new ();
    }

  G_UNLOCK (init);

  if (retval->pool.exclusive)
    {
      g_async_queue_lock (retval->queue);
  
      while (retval->num_threads < retval->max_threads)
	{
	  GError *local_error = NULL;
	  g_thread_pool_start_thread (retval, &local_error);
	  if (local_error)
	    {
	      g_propagate_error (error, local_error);
	      break;
	    }
	}

      g_async_queue_unlock (retval->queue);
    }

  return (GThreadPool*) retval;
}

/**
 * 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 = (GRealThreadPool*) pool;

  g_return_if_fail (real);

  g_async_queue_lock (real->queue);
  
  if (!real->running)
    {
      g_async_queue_unlock (real->queue);
      g_return_if_fail (real->running);
    }

  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);
}

/**
 * g_thread_pool_set_max_threads:
 * @pool: a #GThreadPool
 * @max_threads: a new maximal number of threads for @pool
 * @error: return location for error
 * 
 * Sets the maximal allowed number of threads for @pool. A value of -1
 * means, that the maximal number of threads is unlimited.
 *
 * Setting @max_threads to 0 means stopping all work for @pool. It is
 * effectively frozen until @max_threads is set to a non-zero value
 * again.
 * 
 * A thread is never terminated while calling @func, as supplied by
 * g_thread_pool_new (). Instead the maximal number of threads only
 * has effect for the allocation of new threads in g_thread_pool_push(). 
 * A new thread is allocated, whenever the number of currently
 * running threads in @pool is smaller than the maximal number.
 *
 * @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. 
 **/
void
g_thread_pool_set_max_threads (GThreadPool     *pool,
			       gint             max_threads,
			       GError         **error)
{
  GRealThreadPool *real = (GRealThreadPool*) pool;
  gint to_start;

  g_return_if_fail (real);
  g_return_if_fail (real->running);
  g_return_if_fail (!real->pool.exclusive || max_threads != -1);
  g_return_if_fail (max_threads >= -1);

  g_async_queue_lock (real->queue);

  real->max_threads = max_threads;
  
  if (pool->exclusive)
    to_start = real->max_threads - real->num_threads;
  else
    to_start = g_async_queue_length_unlocked (real->queue);
  
  for ( ; to_start > 0; to_start--)
    {
      GError *local_error = NULL;
      g_thread_pool_start_thread (real, &local_error);
      if (local_error)
	{
	  g_propagate_error (error, local_error);
	  break;
	}
    }
   
  g_async_queue_unlock (real->queue);
}

/**
 * g_thread_pool_get_max_threads:
 * @pool: a #GThreadPool
 *
 * Returns the maximal number of threads for @pool.
 *
 * Return value: the maximal number of threads
 **/
gint
g_thread_pool_get_max_threads (GThreadPool     *pool)
{
  GRealThreadPool *real = (GRealThreadPool*) pool;
  gint retval;

  g_return_val_if_fail (real, 0);
  g_return_val_if_fail (real->running, 0);

  g_async_queue_lock (real->queue);

  retval = real->max_threads;
    
  g_async_queue_unlock (real->queue);

  return retval;
}

/**
 * g_thread_pool_get_num_threads:
 * @pool: a #GThreadPool
 *
 * Returns the number of threads currently running in @pool.
 *
 * Return value: the number of threads currently running
 **/
guint
g_thread_pool_get_num_threads (GThreadPool     *pool)
{
  GRealThreadPool *real = (GRealThreadPool*) pool;
  guint retval;

  g_return_val_if_fail (real, 0);
  g_return_val_if_fail (real->running, 0);

  g_async_queue_lock (real->queue);

  retval = real->num_threads;
    
  g_async_queue_unlock (real->queue);

  return retval;
}

/**
 * g_thread_pool_unprocessed:
 * @pool: a #GThreadPool
 *
 * Returns the number of tasks still unprocessed in @pool.
 *
 * Return value: the number of unprocessed tasks
 **/
guint
g_thread_pool_unprocessed (GThreadPool     *pool)
{
  GRealThreadPool *real = (GRealThreadPool*) pool;
  gint unprocessed;

  g_return_val_if_fail (real, 0);
  g_return_val_if_fail (real->running, 0);

  unprocessed = g_async_queue_length (real->queue);

  return MAX (unprocessed, 0);
}

/**
 * g_thread_pool_free:
 * @pool: a #GThreadPool
 * @immediate: should @pool shut down immediately?
 * @wait: should the function wait for all tasks to be finished?
 *
 * Frees all resources allocated for @pool.
 *
 * If @immediate is %TRUE, no new task is processed for
 * @pool. Otherwise @pool is not freed before the last task is
 * processed. Note however, that no thread of this pool is
 * interrupted, while processing a task. Instead at least all still
 * running threads can finish their tasks before the @pool is freed.
 *
 * If @wait is %TRUE, the functions does not return before all tasks
 * to be processed (dependent on @immediate, whether all or only the
 * currently running) are ready. Otherwise the function returns immediately.
 *
 * After calling this function @pool must not be used anymore. 
 **/
void
g_thread_pool_free (GThreadPool     *pool,
		    gboolean         immediate,
		    gboolean         wait)
{
  GRealThreadPool *real = (GRealThreadPool*) pool;

  g_return_if_fail (real);
  g_return_if_fail (real->running);
  /* It there's no thread allowed here, there is not much sense in
   * not stopping this pool immediately, when it's not empty */
  g_return_if_fail (immediate || real->max_threads != 0 || 
		    g_async_queue_length (real->queue) == 0);

  g_async_queue_lock (real->queue);

  real->running = FALSE;
  real->immediate = immediate;
  real->waiting = wait;

  if (wait)
    {
      g_mutex_lock (inform_mutex);
      while (g_async_queue_length_unlocked (real->queue) != -real->num_threads &&
	     !(immediate && real->num_threads == 0))
	{
	  g_async_queue_unlock (real->queue); 
	  g_cond_wait (inform_cond, inform_mutex); 
	  g_async_queue_lock (real->queue); 
	}
      g_mutex_unlock (inform_mutex); 
    }

  if (immediate ||
      g_async_queue_length_unlocked (real->queue) == -real->num_threads)
    {
      /* No thread is currently doing something (and nothing is left
       * to process in the queue) */
      if (real->num_threads == 0) /* No threads left, we clean up */
	{
	  g_async_queue_unlock (real->queue);
	  g_thread_pool_free_internal (real);
	  return;
	}

      g_thread_pool_wakeup_and_stop_all (real);
    }
  
  real->waiting = FALSE; /* The last thread should cleanup the pool */
  g_async_queue_unlock (real->queue);
}

static void
g_thread_pool_free_internal (GRealThreadPool* pool)
{
  g_return_if_fail (pool);
  g_return_if_fail (!pool->running);
  g_return_if_fail (pool->num_threads == 0);

  g_async_queue_unref (pool->queue);

  g_free (pool);
}

static void
g_thread_pool_wakeup_and_stop_all (GRealThreadPool* pool)
{
  guint i;
  
  g_return_if_fail (pool);
  g_return_if_fail (!pool->running);
  g_return_if_fail (pool->num_threads != 0);
  g_return_if_fail (g_async_queue_length_unlocked (pool->queue) == 
		    -pool->num_threads);

  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_set_max_unused_threads:
 * @max_threads: maximal number of unused threads
 *
 * Sets the maximal number of unused threads to @max_threads. If
 * @max_threads is -1, no limit is imposed on the number of unused
 * threads.
 **/
void
g_thread_pool_set_max_unused_threads (gint max_threads)
{
  g_return_if_fail (max_threads >= -1);  

  g_async_queue_lock (unused_thread_queue);
  
  max_unused_threads = max_threads;

  if (max_unused_threads < unused_threads && max_unused_threads != -1)
    {
      guint i;
      wakeup_thread_serial++;

      for (i = unused_threads - max_unused_threads; i > 0; i--)
	g_async_queue_push_unlocked (unused_thread_queue, 
				     wakeup_thread_marker);
    }
    
  g_async_queue_unlock (unused_thread_queue);
}

/**
 * g_thread_pool_get_max_unused_threads:
 * 
 * Returns the maximal allowed number of unused threads.
 *
 * Return value: the maximal number of unused threads
 **/
gint
g_thread_pool_get_max_unused_threads (void)
{
  gint retval;
  
  g_async_queue_lock (unused_thread_queue);
  retval = max_unused_threads;
  g_async_queue_unlock (unused_thread_queue);

  return retval;
}

/**
 * g_thread_pool_get_num_unused_threads:
 * 
 * Returns the number of currently unused threads.
 *
 * Return value: the number of currently unused threads
 **/
guint 
g_thread_pool_get_num_unused_threads (void)
{
  guint retval;
  
  g_async_queue_lock (unused_thread_queue);
  retval = unused_threads;
  g_async_queue_unlock (unused_thread_queue);

  return retval;
}

/**
 * g_thread_pool_stop_unused_threads:
 * 
 * Stops all currently unused threads. This does not change the
 * maximal number of unused threads. This function can be used to
 * regularly stop all unused threads e.g. from g_timeout_add().
 **/
void
g_thread_pool_stop_unused_threads (void)
{ 
  guint oldval = g_thread_pool_get_max_unused_threads ();
  g_thread_pool_set_max_unused_threads (0);
  g_thread_pool_set_max_unused_threads (oldval);
}

/**
 * g_thread_pool_set_sort_function:
 * @pool: a #GThreadPool
 * @func: the #GCompareDataFunc used to sort the list of tasks. 
 *     This function is passed two tasks. It should return
 *     0 if the order in which they are handled does not matter, 
 *     a negative value if the first task should be processed before
 *     the second or a positive value if the second task should be 
 *     processed first.
 * @user_data: user data passed to @func.
 *
 * Sets the function used to sort the list of tasks. This allows the
 * tasks to be processed by a priority determined by @func, and not
 * just in the order in which they were added to the pool.
 *
 * Since: 2.10
 **/
void 
g_thread_pool_set_sort_function (GThreadPool      *pool,
				 GCompareDataFunc  func,
				 gpointer          user_data)
{ 
  GRealThreadPool *real = (GRealThreadPool*) pool;

  g_return_if_fail (real);
  g_return_if_fail (real->running);

  g_async_queue_lock (real->queue);

  real->sort_func = func;
  real->sort_user_data = user_data;
  
  if (func) 
    g_async_queue_sort_unlocked (real->queue, 
				 real->sort_func,
				 real->sort_user_data);

  g_async_queue_unlock (real->queue);
}

/**
 * g_thread_pool_set_max_idle_time:
 * @interval: the maximum @interval (1/1000ths of a second) a thread
 *     can be idle. 
 *
 * This function will set the maximum @interval that a thread waiting
 * in the pool for new tasks can be idle for before being
 * stopped. This function is similar to calling
 * g_thread_pool_stop_unused_threads() on a regular timeout, except,
 * this is done on a per thread basis.    
 *
 * By setting @interval to 0, idle threads will not be stopped.
 *  
 * This function makes use of g_async_queue_timed_pop () using
 * @interval.
 *
 * Since: 2.10
 **/
void
g_thread_pool_set_max_idle_time (guint interval)
{ 
  guint i;

  g_async_queue_lock (unused_thread_queue);
  max_idle_time = interval;    
  wakeup_thread_serial++;

  for (i = 0; i < unused_threads; i++)
    g_async_queue_push_unlocked (unused_thread_queue, wakeup_thread_marker);

  g_async_queue_unlock (unused_thread_queue);
}

/**
 * g_thread_pool_get_max_idle_time:
 * 
 * This function will return the maximum @interval that a thread will
 * wait in the thread pool for new tasks before being stopped.
 *
 * If this function returns 0, threads waiting in the thread pool for
 * new work are not stopped.
 *
 * Return value: the maximum @interval to wait for new tasks in the
 *     thread pool before stopping the thread (1/1000ths of a second).
 *  
 * Since: 2.10
 **/
guint
g_thread_pool_get_max_idle_time (void)
{ 
  guint retval;

  g_async_queue_lock (unused_thread_queue);
  retval = max_idle_time;
  g_async_queue_unlock (unused_thread_queue);

  return retval;
}

#define __G_THREADPOOL_C__
#include "galiasdef.c"
