aboutsummaryrefslogtreecommitdiff
path: root/libjava/include/posix-threads.h
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/include/posix-threads.h')
-rw-r--r--libjava/include/posix-threads.h210
1 files changed, 210 insertions, 0 deletions
diff --git a/libjava/include/posix-threads.h b/libjava/include/posix-threads.h
new file mode 100644
index 0000000..6e4cc70
--- /dev/null
+++ b/libjava/include/posix-threads.h
@@ -0,0 +1,210 @@
+// -*- c++ -*-
+// posix-threads.h - Defines for using POSIX threads.
+
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ 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_POSIX_THREADS__
+#define __JV_POSIX_THREADS__
+
+// NOTE: This file may only reference those pthread functions which
+// are known not to be overridden by the Boehm GC. If in doubt, scan
+// boehm-gc/gc.h. This is yucky but lets us avoid including gc.h
+// everywhere (which would be truly yucky).
+
+#include <pthread.h>
+#include <sched.h>
+
+#if defined (HAVE_PTHREAD_MUTEXATTR_SETTYPE) || defined (HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
+# define HAVE_RECURSIVE_MUTEX 1
+#endif
+
+
+//
+// Typedefs.
+//
+
+typedef pthread_cond_t _Jv_ConditionVariable_t;
+#ifdef HAVE_RECURSIVE_MUTEX
+typedef pthread_mutex_t _Jv_Mutex_t;
+#else
+// Some systems do not have recursive mutexes, so we must simulate
+// them. Solaris is one such system.
+typedef struct
+{
+ // Mutex used when locking this structure transiently.
+ pthread_mutex_t mutex;
+ // Mutex the thread holds the entire time this mutex is held. This
+ // is used to make condition variables work properly.
+ pthread_mutex_t mutex2;
+ // Condition variable used when waiting for this lock.
+ pthread_cond_t cond;
+ // Thread holding this mutex. If COUNT is 0, no thread is holding.
+ pthread_t thread;
+ // Number of times mutex is held. If 0, the lock is not held.
+ int count;
+} _Jv_Mutex_t;
+#endif /* HAVE_RECURSIVE_MUTEX */
+
+typedef struct
+{
+ // Flag values are defined in implementation.
+ int flags;
+
+ // Actual thread id.
+ pthread_t thread;
+
+ // Exception we want to throw when cancelled.
+ void *exception;
+} _Jv_Thread_t;
+typedef void _Jv_ThreadStartFunc (java::lang::Thread *);
+
+
+//
+// Condition variables.
+//
+
+inline void
+_Jv_CondInit (_Jv_ConditionVariable_t *cv)
+{
+ pthread_cond_init (cv, 0);
+}
+
+#ifndef LINUX_THREADS
+
+// pthread_cond_destroy does nothing on Linux and it is a win to avoid
+// defining this macro.
+
+#define _Jv_HaveCondDestroy
+
+inline void
+_Jv_CondDestroy (_Jv_ConditionVariable_t *cv)
+{
+ pthread_cond_destroy (cv);
+}
+
+#endif /* LINUX_THREADS */
+
+int _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
+ jlong millis, jint nanos);
+
+inline int
+_Jv_CondNotify (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *)
+{
+ // FIXME: check to see if mutex is held by current thread.
+ return pthread_cond_signal (cv);
+}
+
+inline int
+_Jv_CondNotifyAll (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *)
+{
+ // FIXME: check to see if mutex is held by current thread.
+ return pthread_cond_broadcast (cv);
+}
+
+
+//
+// Mutexes.
+//
+
+#ifdef RECURSIVE_MUTEX_IS_DEFAULT
+inline void
+_Jv_MutexInit (_Jv_Mutex_t *mu)
+{
+ pthread_mutex_init (mu, NULL);
+}
+#else
+void _Jv_MutexInit (_Jv_Mutex_t *mu);
+#endif
+
+#ifndef LINUX_THREADS
+
+// pthread_mutex_destroy does nothing on Linux and it is a win to avoid
+// defining this macro.
+
+#define _Jv_HaveMutexDestroy
+
+#ifdef HAVE_RECURSIVE_MUTEX
+
+inline void
+_Jv_MutexDestroy (_Jv_Mutex_t *mu)
+{
+ pthread_mutex_destroy (mu);
+}
+
+#else /* HAVE_RECURSIVE_MUTEX */
+
+extern void _Jv_MutexDestroy (_Jv_Mutex_t *mu);
+
+#endif /* HAVE_RECURSIVE_MUTEX */
+#endif /* LINUX_THREADS */
+
+#ifdef HAVE_RECURSIVE_MUTEX
+
+inline int
+_Jv_MutexLock (_Jv_Mutex_t *mu)
+{
+ return pthread_mutex_lock (mu);
+}
+
+inline int
+_Jv_MutexUnlock (_Jv_Mutex_t *mu)
+{
+ return pthread_mutex_unlock (mu);
+}
+
+#else /* HAVE_RECURSIVE_MUTEX */
+
+extern int _Jv_MutexLock (_Jv_Mutex_t *mu);
+extern int _Jv_MutexUnlock (_Jv_Mutex_t *mu);
+
+#endif /* HAVE_RECURSIVE_MUTEX */
+
+
+//
+// Thread creation and manipulation.
+//
+
+void _Jv_InitThreads (void);
+
+void _Jv_ThreadInitData (_Jv_Thread_t **data, java::lang::Thread *thread);
+
+inline java::lang::Thread *
+_Jv_ThreadCurrent (void)
+{
+ extern pthread_key_t _Jv_ThreadKey;
+ return (java::lang::Thread *) pthread_getspecific (_Jv_ThreadKey);
+}
+
+inline void
+_Jv_ThreadYield (void)
+{
+#ifdef HAVE_SCHED_YIELD
+ sched_yield ();
+#endif /* HAVE_SCHED_YIELD */
+}
+
+void _Jv_ThreadSetPriority (_Jv_Thread_t *data, jint prio);
+
+void _Jv_ThreadCancel (_Jv_Thread_t *data, void *error);
+
+// Like Cancel, but doesn't run cleanups.
+inline void
+_Jv_ThreadDestroy (_Jv_Thread_t *)
+{
+ JvFail ("_Jv_ThreadDestroy");
+}
+
+void _Jv_ThreadStart (java::lang::Thread *thread, _Jv_Thread_t *data,
+ _Jv_ThreadStartFunc *meth);
+
+void _Jv_ThreadWait (void);
+
+void _Jv_ThreadInterrupt (_Jv_Thread_t *data);
+
+#endif /* __JV_POSIX_THREADS__ */