home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 1998 October
/
PCWorld_1998-10_cd.bin
/
software
/
prehled
/
inprise
/
JRUNTIME.Z
/
threads.h
< prev
next >
Wrap
C/C++ Source or Header
|
1998-05-08
|
5KB
|
151 lines
/*
* @(#)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_ */