home *** CD-ROM | disk | FTP | other *** search
- /*
- * @(#)threads.h 1.34 96/11/23
- *
- * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
- *
- * This software is the confidential and proprietary information of Sun
- * Microsystems, Inc. ("Confidential Information"). You shall not
- * disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into
- * with Sun.
- *
- * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
- * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
- * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
- * THIS SOFTWARE OR ITS DERIVATIVES.
- *
- * CopyrightVersion 1.1_beta
- *
- */
-
- #ifndef _THREADS_H_
- #define _THREADS_H_
-
- #include "oobj.h"
- #include "interpreter.h"
- #include "timeval.h"
- #include "monitor.h"
- #include "bool.h"
- #include "sys_api.h"
-
- #include "java_lang_Thread.h"
- #include "java_lang_ThreadGroup.h"
-
- #define MinimumPriority java_lang_Thread_MIN_PRIORITY
- #define MaximumPriority java_lang_Thread_MAX_PRIORITY
- #define NormalPriority java_lang_Thread_NORM_PRIORITY
-
- /*
- * Support for thread queue
- */
-
- extern sys_mon_t *_queue_lock;
-
- #define QUEUE_LOCK_INIT() monitorRegister(_queue_lock, "Thread queue lock")
- #define QUEUE_LOCK() sysMonitorEnter(_queue_lock)
- #define QUEUE_LOCKED() sysMonitorEntered(_queue_lock)
- #define QUEUE_UNLOCK() sysMonitorExit(_queue_lock)
- #define QUEUE_NOTIFY() sysMonitorNotify(_queue_lock)
- #define QUEUE_WAIT() sysMonitorWait(_queue_lock, \
- SYS_TIMEOUT_INFINITY, FALSE)
-
- /*
- * Thread-related data structures
- */
-
- typedef struct Hjava_lang_Thread HThread;
- typedef struct Hjava_lang_ThreadGroup HThreadGroup;
- typedef struct Hjava_lang_Thread *TID;
-
- typedef sys_thread_t ThreadPrivate;
-
- /* Access to thread data structures */
- #define THREAD(tid) ((struct Classjava_lang_Thread *) unhand(tid))
- #define SYSTHREAD(tid) ((sys_thread_t *)THREAD(tid)->PrivateInfo)
-
- #define THR_SYSTEM 0 /* System thread */
- #define THR_USER 1 /* User thread */
-
- extern int ActiveThreadCount; /* All threads */
- extern int UserThreadCount; /* User threads */
-
- /* The default Java stack size is legitimately platform-independent */
- #define JAVASTACKSIZE (400 * 1024) /* Default size of a thread java stack */
-
- extern long ProcStackSize; /* Actual size of thread C stack */
- extern long JavaStackSize; /* Actual maximum size of java stack */
-
- extern stackp_t mainstktop; /* Base of primordial thread stack */
-
- /*
- * External interface to threads support
- */
-
- void threadBootstrap(TID tid, stackp_t sb);
- int threadCreate(TID, unsigned int, size_t, void *(*)());
- TID threadSelf(void);
- void threadSleep(int);
- int threadEnumerate(TID*, int);
-
- void threadDumpInfo(TID, bool_t); /* Debugging help in debug.c */
-
- int threadPostException(TID tid, void *exc);
- void threadTryVMSuspend(void);
-
- /*
- * There may be certain initialization that can't be done except by the
- * thread on itself, e.g. setting thread-local data in Solaris threads.
- * This function is called from ThreadRT0() when the thread starts up
- * to take care of such things.
- */
- #define threadInit(tid, sb) sysThreadInit(SYSTHREAD(tid), sb)
-
- /*
- * Exit the current thread. This function is not expected to return.
- *
- * Note that we currently never stop a thread dead in its tracks, but
- * rather throw an exception against it that causes it to unwind its
- * stack, exit monitors, etc. and exit in a single place (ThreadRT0).
- * If a thread is caused to exit precipitously by calling threadExit()
- * at random places it will corrupt the runtime and at minimum will
- * fail to clean the thread out of any monitors it currently holds.
- */
- #define threadExit() sysThreadExit()
-
- /*
- * Note that we do not check that priorities are within Java's limits down here.
- * In fact, we make use of that for things like the idle and clock threads.
- * This may change once we work out a portable priority model.
- */
- #define threadSetPriority(tid, pri) sysThreadSetPriority(SYSTHREAD(tid), pri)
- #define threadGetPriority(tid, prip) sysThreadGetPriority(SYSTHREAD(tid), prip)
-
- #define threadYield() sysThreadYield()
- #define threadResume(tid) sysThreadResume(SYSTHREAD(tid))
- #define threadSuspend(tid) sysThreadSuspend(SYSTHREAD(tid))
-
- /*
- * Return information about this thread's stack. This is used by
- * Garbage Collection code that needs to inspect the stack.
- *
- * It is permissable to return a null stack_base for those threads
- * that don't have a known stack (e.g. not allocated by the threads
- * package). It is also permissable to return a somewhat bogus
- * stack_pointer for the current thread.
- */
- #define threadStackBase(tid) sysThreadStackBase(SYSTHREAD(tid))
- #define threadStackPointer(tid) sysThreadStackPointer(SYSTHREAD(tid))
-
- #define threadCheckStack() sysThreadCheckStack()
-
- /*
- * Interface to thread interrupt support
- */
- #define threadInterrupt(tid) sysThreadInterrupt(SYSTHREAD(tid))
- #define threadIsInterrupted(tid, ClearInterrupted) \
- sysThreadIsInterrupted(SYSTHREAD(tid), ClearInterrupted)
-
- #endif /* !_THREADS_H_ */
-