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 clear_thread_flags(void);
98 void startThread(thread*);
99 void resumeThread(thread*);
100 void iresumeThread(thread*);
101 void suspendThread(thread*);
102 void suspendOnQThread(thread*, thread**);
103 void yieldThread(void);
104 void killThread(thread*);
105 void setPriorityThread(thread*, int);
107 void sleepThread(s8);
108 bool aliveThread(thread*);
109 long framesThread(thread*);
111 void reschedule(void);
113 void checkEvents(bool block);
115 extern int blockInts;
116 extern bool needReschedule;
117 extern thread *currentThread;
118 extern thread *mainThread;
119 extern ctx contexts[];
120 extern int threadStackSize;
122 extern thread *liveThreads;
124 extern thread *threadQhead[MAX_THREAD_PRIO + 1];
126 #define CONTEXT(_t) \
127 (contexts[(_t)->PrivateInfo - 1])
130 #define intsDisable() blockInts++
131 #define intsRestore() if (blockInts == 1 && needReschedule) { \
136 #define intsDisable() do { blockInts++; fprintf(stderr, "++: %d (%s:%d)\n", blockInts, __FILE__, __LINE__); } while (0)
137 #define intsRestore() do { \
138 if (blockInts == 1 && needReschedule) { \
142 fprintf(stderr, "--: %d (%s:%d)\n", blockInts, __FILE__, __LINE__); \
148 #define intsDisable()
149 #define intsRestore()