5 * Copyright (c) 1996 T. J. Wilkinson & Associates, London, UK.
7 * See the file "license.terms" for information on usage and redistribution
8 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
10 * Written by Tim Wilkinson <tim@tjwassoc.demon.co.uk>, 1996.
18 #include "../global.h"
20 #define MAXTHREADS 256 /* schani */
22 #define THREADCLASS "java/lang/Thread"
23 #define THREADGROUPCLASS "java/lang/ThreadGroup"
24 #define THREADDEATHCLASS "java/lang/ThreadDeath"
26 #define MIN_THREAD_PRIO 1
27 #define NORM_THREAD_PRIO 5
28 #define MAX_THREAD_PRIO 10
30 #define THREAD_SUSPENDED 0
31 #define THREAD_RUNNING 1
35 #define THREAD_FLAGS_GENERAL 0
36 #define THREAD_FLAGS_NOSTACKALLOC 1
37 #define THREAD_FLAGS_USER_SUSPEND 2 /* Flag explicit suspend() call */
38 #define THREAD_FLAGS_KILLED 4
44 bool free; /* schani */
48 u1* stackMem; /* includes guard page */
53 java_objectheader *exceptionptr;
54 struct _thread *nextlive;
63 /* This structure mirrors java.lang.ThreadGroup.h */
65 typedef struct _threadGroup
67 java_objectheader header;
68 struct _threadGroup* parent;
69 java_objectheader* name;
74 java_objectheader* threads;
76 java_objectheader* groups;
79 /* This structure mirrors java.lang.Thread.h */
80 typedef struct _thread
82 java_objectheader header;
83 java_objectheader* name;
87 struct java_lang_Object* eetop; /* ??? */
91 java_objectheader* target;
92 s4 interruptRequested;
96 void initThreads(u1 *stackbottom);
97 void startThread(thread*);
98 void resumeThread(thread*);
99 void iresumeThread(thread*);
100 void suspendThread(thread*);
101 void suspendOnQThread(thread*, thread**);
102 void yieldThread(void);
103 void killThread(thread*);
104 void setPriorityThread(thread*, int);
106 void sleepThread(s8);
107 bool aliveThread(thread*);
108 long framesThread(thread*);
110 void reschedule(void);
112 void checkEvents(bool block);
114 extern int blockInts;
115 extern bool needReschedule;
116 extern thread *currentThread;
117 extern ctx contexts[];
118 extern int threadStackSize;
120 extern thread *liveThreads;
122 extern thread *threadQhead[MAX_THREAD_PRIO + 1];
124 #define CONTEXT(_t) \
125 (contexts[(_t)->PrivateInfo - 1])
128 #define intsDisable() blockInts++
129 #define intsRestore() if (blockInts == 1 && needReschedule) { \
134 #define intsDisable() do { blockInts++; fprintf(stderr, "++: %d (%s:%d)\n", blockInts, __FILE__, __LINE__); } while (0)
135 #define intsRestore() do { \
136 if (blockInts == 1 && needReschedule) { \
140 fprintf(stderr, "--: %d (%s:%d)\n", blockInts, __FILE__, __LINE__); \
146 #define intsDisable()
147 #define intsRestore()