1 /* -*- mode: c; tab-width: 4; c-basic-offset: 4 -*- */
6 * Copyright (c) 1996 T. J. Wilkinson & Associates, London, UK.
8 * See the file "license.terms" for information on usage and redistribution
9 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
11 * Written by Tim Wilkinson <tim@tjwassoc.demon.co.uk>, 1996.
23 #define MAXTHREADS 256 /* schani */
25 #define THREADCLASS "java/lang/Thread"
26 #define THREADGROUPCLASS "java/lang/ThreadGroup"
27 #define THREADDEATHCLASS "java/lang/ThreadDeath"
29 #define MIN_THREAD_PRIO 1
30 #define NORM_THREAD_PRIO 5
31 #define MAX_THREAD_PRIO 10
33 #define THREAD_SUSPENDED 0
34 #define THREAD_RUNNING 1
38 #define THREAD_FLAGS_GENERAL 0
39 #define THREAD_FLAGS_NOSTACKALLOC 1
40 #define THREAD_FLAGS_USER_SUSPEND 2 /* Flag explicit suspend() call */
41 #define THREAD_FLAGS_KILLED 4
47 struct _thread *thread;
52 u1* stackMem; /* includes guard page */
57 java_objectheader *exceptionptr;
58 struct _thread *nextlive;
67 /* This structure mirrors java.lang.ThreadGroup.h */
69 typedef struct _threadGroup
71 java_objectheader header;
72 struct _threadGroup* parent;
73 java_objectheader* name;
78 java_objectheader* threads;
80 java_objectheader* groups;
83 /* This structure mirrors java.lang.Thread.h */
84 typedef struct _thread
86 java_objectheader header;
87 java_objectheader* name;
91 struct java_lang_Object* eetop; /* ??? */
95 java_objectheader* target;
96 s4 interruptRequested;
100 void initThreads(u1 *stackbottom);
101 void clear_thread_flags(void);
102 void startThread(thread*);
103 void resumeThread(thread*);
104 void iresumeThread(thread*);
105 void suspendThread(thread*);
106 void suspendOnQThread(thread*, thread**);
107 void yieldThread(void);
108 void killThread(thread*);
109 void setPriorityThread(thread*, int);
111 void sleepThread(s8);
112 bool aliveThread(thread*);
113 long framesThread(thread*);
115 void reschedule(void);
117 void checkEvents(bool block);
119 extern int blockInts;
120 extern bool needReschedule;
121 extern thread *currentThread;
122 extern thread *mainThread;
123 extern ctx contexts[];
124 extern int threadStackSize;
126 extern thread *liveThreads;
128 extern thread *threadQhead[MAX_THREAD_PRIO + 1];
130 #define CONTEXT(_t) \
131 (contexts[(_t)->PrivateInfo - 1])
134 #define intsDisable() blockInts++
135 #define intsRestore() if (blockInts == 1 && needReschedule) { \
140 #define intsDisable() do { blockInts++; fprintf(stderr, "++: %d (%s:%d)\n", blockInts, __FILE__, __LINE__); } while (0)
141 #define intsRestore() do { \
142 if (blockInts == 1 && needReschedule) { \
146 fprintf(stderr, "--: %d (%s:%d)\n", blockInts, __FILE__, __LINE__); \
152 #define intsDisable()
153 #define intsRestore()