/* GLIB - Library of useful routines for C programming
 * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * gthread.c: thread related functions
 * Copyright 1998 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.
 */

/*
 * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
 * file for a list of people on the GLib Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GLib at ftp://ftp.gtk.org/pub/gtk/.
 */

/*
 * MT safe
 */

#include "config.h"

#include "glib.h"
#include "gthreadprivate.h"

#ifdef G_THREADS_ENABLED

static GSystemThread zero_thread; /* This is initialized to all zero */
static gboolean thread_system_already_initialized = FALSE;
static gint g_thread_priority_map [G_THREAD_PRIORITY_URGENT + 1];

#include G_THREAD_SOURCE

#ifndef PRIORITY_LOW_VALUE
# define PRIORITY_LOW_VALUE 0
#endif

#ifndef PRIORITY_URGENT_VALUE
# define PRIORITY_URGENT_VALUE 0
#endif

#ifndef PRIORITY_NORMAL_VALUE
# define PRIORITY_NORMAL_VALUE						\
  ((PRIORITY_LOW_VALUE * 6 + PRIORITY_URGENT_VALUE * 4) / 10)
#endif /* PRIORITY_NORMAL_VALUE */

#ifndef PRIORITY_HIGH_VALUE
# define PRIORITY_HIGH_VALUE						\
  ((PRIORITY_NORMAL_VALUE + PRIORITY_URGENT_VALUE * 2) / 3)
#endif /* PRIORITY_HIGH_VALUE */

void g_mutex_init (void);
void g_mem_init (void);
void g_messages_init (void);
void g_convert_init (void);
void g_rand_init (void);
void g_main_thread_init (void);

typedef struct _GMutexDebugInfo GMutexDebugInfo;
struct _GMutexDebugInfo
{
  gchar *location;
  GSystemThread owner;
};

#define G_MUTEX_DEBUG_INFO(mutex) 					\
  (((GMutexDebugInfo*)(((char*)mutex)+G_MUTEX_SIZE)))

static GMutex *
g_mutex_new_errorcheck_impl (void)
{
  GMutex *retval = g_thread_functions_for_glib_use_default.mutex_new ();
  GMutexDebugInfo *info;
  retval = g_realloc (retval, G_MUTEX_SIZE + sizeof (GMutexDebugInfo));

  info = G_MUTEX_DEBUG_INFO (retval);
  g_system_thread_assign (info->owner, zero_thread);
  info->location = "invalid";

  return retval;
}

static void
g_mutex_lock_errorcheck_impl (GMutex *mutex,
			      const gulong magic,
			      gchar * const location)
{
  GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
  gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";

  GSystemThread self;
  g_thread_functions_for_glib_use.thread_self (&self);

  if (g_system_thread_equal (info->owner, self))
    g_error ("Trying to recursivly lock a mutex at '%s', "
	     "previously locked at '%s'",
	     loc, info->location);

  g_thread_functions_for_glib_use_default.mutex_lock (mutex);

  g_system_thread_assign (info->owner, self);
  info->location = loc;
}

static gboolean
g_mutex_trylock_errorcheck_impl (GMutex *mutex,
				 const gulong magic,
				 gchar * const location)
{
  GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
  gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";

  GSystemThread self;
  g_thread_functions_for_glib_use.thread_self (&self);

  if (g_system_thread_equal (info->owner, self))
    g_error ("Trying to recursivly lock a mutex at '%s', "
	     "previously locked at '%s'",
	     loc, info->location);

  if (!g_thread_functions_for_glib_use_default.mutex_trylock (mutex))
    return FALSE;

  g_system_thread_assign (info->owner, self);
  info->location = loc;

  return TRUE;
}

static void
g_mutex_unlock_errorcheck_impl (GMutex *mutex,
				const gulong magic,
				gchar * const location)
{
  GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
  gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";

  GSystemThread self;
  g_thread_functions_for_glib_use.thread_self (&self);

  if (g_system_thread_equal (info->owner, zero_thread))
    g_error ("Trying to unlock an unlocked mutex at '%s'", loc);

  if (!g_system_thread_equal (info->owner, self))
    g_warning ("Trying to unlock a mutex at '%s', "
	       "previously locked by a different thread at '%s'",
	       loc, info->location);

  g_system_thread_assign (info->owner, zero_thread);
  info->location = NULL;

  g_thread_functions_for_glib_use_default.mutex_unlock (mutex);
}

static void
g_mutex_free_errorcheck_impl (GMutex *mutex,
			      const gulong magic,
			      gchar * const location)
{
  GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
  gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";

  if (info && !g_system_thread_equal (info->owner, zero_thread))
    g_error ("Trying to free a locked mutex at '%s', "
	     "which was previously locked at '%s'",
	     loc, info->location);

  g_thread_functions_for_glib_use_default.mutex_free (mutex);
}

static void
g_cond_wait_errorcheck_impl (GCond *cond,
			     GMutex *mutex,
			     const gulong magic,
			     gchar * const location)
{
  GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
  gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";

  GSystemThread self;
  g_thread_functions_for_glib_use.thread_self (&self);

  if (g_system_thread_equal (info->owner, zero_thread))
    g_error ("Trying to use an unlocked mutex in g_cond_wait() at '%s'", loc);

  if (!g_system_thread_equal (info->owner, self))
    g_error ("Trying to use a mutex locked by another thread in "
	     "g_cond_wait() at '%s'", loc);

  g_system_thread_assign (info->owner, zero_thread);
  loc = info->location;

  g_thread_functions_for_glib_use_default.cond_wait (cond, mutex);

  g_system_thread_assign (info->owner, self);
  info->location = loc;
}


static gboolean
g_cond_timed_wait_errorcheck_impl (GCond *cond,
                                   GMutex *mutex,
                                   GTimeVal *end_time,
				   const gulong magic,
				   gchar * const location)
{
  GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
  gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";
  gboolean retval;

  GSystemThread self;
  g_thread_functions_for_glib_use.thread_self (&self);

  if (g_system_thread_equal (info->owner, zero_thread))
    g_error ("Trying to use an unlocked mutex in g_cond_timed_wait() at '%s'",
	     loc);

  if (!g_system_thread_equal (info->owner, self))
    g_error ("Trying to use a mutex locked by another thread in "
	     "g_cond_timed_wait() at '%s'", loc);

  g_system_thread_assign (info->owner, zero_thread);
  loc = info->location;

  retval = g_thread_functions_for_glib_use_default.cond_timed_wait (cond,
								    mutex,
								    end_time);

  g_system_thread_assign (info->owner, self);
  info->location = loc;

  return retval;
}


/* unshadow function declaration. See gthread.h */
#undef g_thread_init

void
g_thread_init_with_errorcheck_mutexes (GThreadFunctions* init)
{
  GThreadFunctions errorcheck_functions;
  if (init)
    g_error ("Errorcheck mutexes can only be used for native "
	     "thread implementations. Sorry." );

#ifdef HAVE_G_THREAD_IMPL_INIT
  /* This isn't called in g_thread_init, as it doesn't think to get
   * the default implementation, so we have to call it on our own.
   *
   * We must call this before copying
   * g_thread_functions_for_glib_use_default as the
   * implementation-specific init function might modify the contents
   * of g_thread_functions_for_glib_use_default based on operating
   * system version, C library version, or whatever. */
  g_thread_impl_init();
#endif /* HAVE_G_THREAD_IMPL_INIT */

  errorcheck_functions = g_thread_functions_for_glib_use_default;
  errorcheck_functions.mutex_new = g_mutex_new_errorcheck_impl;
  errorcheck_functions.mutex_lock =
    (void (*)(GMutex *)) g_mutex_lock_errorcheck_impl;
  errorcheck_functions.mutex_trylock =
    (gboolean (*)(GMutex *)) g_mutex_trylock_errorcheck_impl;
  errorcheck_functions.mutex_unlock =
    (void (*)(GMutex *)) g_mutex_unlock_errorcheck_impl;
  errorcheck_functions.mutex_free =
    (void (*)(GMutex *)) g_mutex_free_errorcheck_impl;
  errorcheck_functions.cond_wait =
    (void (*)(GCond *, GMutex *)) g_cond_wait_errorcheck_impl;
  errorcheck_functions.cond_timed_wait =
    (gboolean (*)(GCond *, GMutex *, GTimeVal *))
    g_cond_timed_wait_errorcheck_impl;

  g_thread_init (&errorcheck_functions);
}

void
g_thread_init (GThreadFunctions* init)
{
  gboolean supported;

  if (thread_system_already_initialized)
    {
      if (init != NULL)
	g_warning ("GThread system already initialized, ignoring custom thread implementation.");

      return;
    }

  thread_system_already_initialized = TRUE;

  if (init == NULL)
    {
#ifdef HAVE_G_THREAD_IMPL_INIT
      /* now do any initialization stuff required by the
       * implementation, but only if called with a NULL argument, of
       * course. Otherwise it's up to the user to do so. */
      g_thread_impl_init();
#endif /* HAVE_G_THREAD_IMPL_INIT */
      init = &g_thread_functions_for_glib_use_default;
    }
  else
    g_thread_use_default_impl = FALSE;

  g_thread_functions_for_glib_use = *init;
  if (g_thread_gettime_impl)
    g_thread_gettime = g_thread_gettime_impl;

  supported = (init->mutex_new &&
	       init->mutex_lock &&
	       init->mutex_trylock &&
	       init->mutex_unlock &&
	       init->mutex_free &&
	       init->cond_new &&
	       init->cond_signal &&
	       init->cond_broadcast &&
	       init->cond_wait &&
	       init->cond_timed_wait &&
	       init->cond_free &&
	       init->private_new &&
	       init->private_get &&
	       init->private_set &&
	       init->thread_create &&
	       init->thread_yield &&
	       init->thread_join &&
	       init->thread_exit &&
	       init->thread_set_priority &&
	       init->thread_self);

  /* if somebody is calling g_thread_init (), it means that he wants to
   * have thread support, so check this
   */
  if (!supported)
    {
      if (g_thread_use_default_impl)
	g_error ("Threads are not supported on this platform.");
      else
	g_error ("The supplied thread function vector is invalid.");
    }

  g_thread_priority_map [G_THREAD_PRIORITY_LOW] = PRIORITY_LOW_VALUE;
  g_thread_priority_map [G_THREAD_PRIORITY_NORMAL] = PRIORITY_NORMAL_VALUE;
  g_thread_priority_map [G_THREAD_PRIORITY_HIGH] = PRIORITY_HIGH_VALUE;
  g_thread_priority_map [G_THREAD_PRIORITY_URGENT] = PRIORITY_URGENT_VALUE;

  g_thread_init_glib ();
}

#else /* !G_THREADS_ENABLED */

void
g_thread_init (GThreadFunctions* init)
{
  g_error ("GLib thread support is disabled.");
}

void
g_thread_init_with_errorcheck_mutexes (GThreadFunctions* init)
{
  g_error ("GLib thread support is disabled.");
}

#endif /* !G_THREADS_ENABLED */
