// -*- c++ -*-
// no-threads.h - Defines for using no threads.

/* Copyright (C) 1998, 1999, 2004  Free Software Foundation

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

#ifndef __JV_NO_THREADS__
#define __JV_NO_THREADS__

#include "config.h"

#include <stdlib.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

//
// Typedefs.
//

typedef int _Jv_ConditionVariable_t;
typedef int _Jv_Mutex_t;
typedef int _Jv_Thread_t;
typedef void _Jv_ThreadStartFunc (java::lang::Thread *);


//
// Condition variables.
//

inline void
_Jv_CondInit (_Jv_ConditionVariable_t *)
{
}

// Waiting is ok provided there is a timeout.  Otherwise we will just
// wait forever.
inline int
_Jv_CondWait (_Jv_ConditionVariable_t *, _Jv_Mutex_t *,
	      jlong millis, jint nanos)
{
  if (millis == 0 && nanos == 0)
    JvFail ("_Jv_CondWait without timeout");

#ifdef HAVE_SLEEP
  int seconds = millis / 1000;
  if (seconds > 0)
    sleep (seconds);
#endif

  return 0;
}

inline int
_Jv_CondNotify (_Jv_ConditionVariable_t *, _Jv_Mutex_t *)
{
  // It is ok to notify -- it just has no effect.
  return 0;
}

inline int
_Jv_CondNotifyAll (_Jv_ConditionVariable_t *, _Jv_Mutex_t *)
{
  // It is ok to notify -- it just has no effect.
  return 0;
}


//
// Mutexes.
//

inline int _Jv_MutexCheckMonitor (_Jv_Mutex_t *)
{
  return 0;
}

inline void
_Jv_MutexInit (_Jv_Mutex_t *)
{
}

inline int
_Jv_MutexLock (_Jv_Mutex_t *)
{
  return 0;
}

inline int
_Jv_MutexUnlock (_Jv_Mutex_t *)
{
  return 0;
}


//
// Thread creation and manipulation.
//

inline void
_Jv_InitThreads (void)
{
}

_Jv_Thread_t *
_Jv_ThreadInitData (java::lang::Thread *);

inline void
_Jv_ThreadDestroyData (_Jv_Thread_t *)
{
}

inline java::lang::Thread *
_Jv_ThreadCurrent (void)
{
  extern java::lang::Thread *_Jv_OnlyThread;
  return _Jv_OnlyThread;
}

inline void
_Jv_ThreadYield (void)
{
}

inline void
_Jv_ThreadSetPriority (_Jv_Thread_t *, jint)
{
}

inline void
_Jv_ThreadRegister (_Jv_Thread_t *)
{
}

inline void
_Jv_ThreadUnRegister (void)
{
}

void _Jv_ThreadStart (java::lang::Thread *, _Jv_Thread_t *,
		      _Jv_ThreadStartFunc *meth);

inline void
_Jv_ThreadWait (void)
{
}

inline void
_Jv_ThreadInterrupt (_Jv_Thread_t *)
{
}

#endif /* __JV_NO_THREADS__ */
