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.
19 #include "../global.h"
21 #define MAXTHREADS 256 /* schani */
23 #define THREADCLASS "java/lang/Thread"
24 #define THREADGROUPCLASS "java/lang/ThreadGroup"
25 #define THREADDEATHCLASS "java/lang/ThreadDeath"
27 #define MIN_THREAD_PRIO 1
28 #define NORM_THREAD_PRIO 5
29 #define MAX_THREAD_PRIO 10
31 #define THREAD_SUSPENDED 0
32 #define THREAD_RUNNING 1
36 #define THREAD_FLAGS_GENERAL 0
37 #define THREAD_FLAGS_NOSTACKALLOC 1
38 #define THREAD_FLAGS_USER_SUSPEND 2 /* Flag explicit suspend() call */
39 #define THREAD_FLAGS_KILLED 4
45 struct _thread *thread;
50 u1* stackMem; /* includes guard page */
55 java_objectheader *exceptionptr;
56 struct _thread *nextlive;
65 /* This structure mirrors java.lang.ThreadGroup.h */
67 typedef struct _threadGroup
69 java_objectheader header;
70 struct _threadGroup* parent;
71 java_objectheader* name;
76 java_objectheader* threads;
78 java_objectheader* groups;
81 /* This structure mirrors java.lang.Thread.h */
82 typedef struct _thread
84 java_objectheader header;
85 java_objectheader* name;
89 struct java_lang_Object* eetop; /* ??? */
93 java_objectheader* target;
94 s4 interruptRequested;
98 void initThreads(u1 *stackbottom);
99 void clear_thread_flags(void);
100 void startThread(thread*);
101 void resumeThread(thread*);
102 void iresumeThread(thread*);
103 void suspendThread(thread*);
104 void suspendOnQThread(thread*, thread**);
105 void yieldThread(void);
106 void killThread(thread*);
107 void setPriorityThread(thread*, int);
109 void sleepThread(s8);
110 bool aliveThread(thread*);
111 long framesThread(thread*);
113 void reschedule(void);
115 void checkEvents(bool block);
117 extern int blockInts;
118 extern bool needReschedule;
119 extern thread *currentThread;
120 extern thread *mainThread;
121 extern ctx contexts[];
122 extern int threadStackSize;
124 extern thread *liveThreads;
126 extern thread *threadQhead[MAX_THREAD_PRIO + 1];
128 #define CONTEXT(_t) \
129 (contexts[(_t)->PrivateInfo - 1])
132 #define intsDisable() blockInts++
133 #define intsRestore() if (blockInts == 1 && needReschedule) { \
138 #define intsDisable() do { blockInts++; fprintf(stderr, "++: %d (%s:%d)\n", blockInts, __FILE__, __LINE__); } while (0)
139 #define intsRestore() do { \
140 if (blockInts == 1 && needReschedule) { \
144 fprintf(stderr, "--: %d (%s:%d)\n", blockInts, __FILE__, __LINE__); \
150 #define intsDisable()
151 #define intsRestore()