Clearing of thread flags added
[cacao.git] / src / threads / green / threads.h
1 /*
2  * thread.h
3  * Thread support.
4  *
5  * Copyright (c) 1996 T. J. Wilkinson & Associates, London, UK.
6  *
7  * See the file "license.terms" for information on usage and redistribution
8  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
9  *
10  * Written by Tim Wilkinson <tim@tjwassoc.demon.co.uk>, 1996.
11  */
12
13 #ifndef __thread_h
14 #define __thread_h
15
16 #ifdef USE_THREADS
17
18 #include "../global.h"
19
20 #define MAXTHREADS              256          /* schani */
21
22 #define THREADCLASS             "java/lang/Thread"
23 #define THREADGROUPCLASS        "java/lang/ThreadGroup"
24 #define THREADDEATHCLASS        "java/lang/ThreadDeath"
25
26 #define MIN_THREAD_PRIO         1
27 #define NORM_THREAD_PRIO        5
28 #define MAX_THREAD_PRIO         10
29
30 #define THREAD_SUSPENDED        0
31 #define THREAD_RUNNING          1
32 #define THREAD_DEAD             2
33 #define THREAD_KILL             3
34
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
39
40 struct _thread;
41
42 typedef struct _ctx
43 {
44     bool               free;           /* schani */
45     u1                 status;
46     u1                 priority;
47     u1*                restorePoint;
48     u1*                stackMem;           /* includes guard page */
49     u1*                stackBase;
50     u1*                stackEnd;
51     u1*                usedStackTop;
52     s8                 time;
53     java_objectheader *exceptionptr;
54     struct _thread    *nextlive;
55     u1                 flags;
56 } ctx;
57
58 /*
59 struct _stringClass;
60 struct _object;
61 */
62
63 /* This structure mirrors java.lang.ThreadGroup.h */
64
65 typedef struct _threadGroup
66 {
67     java_objectheader    header;
68     struct _threadGroup* parent;
69     java_objectheader*   name;
70     s4                   maxPrio;
71     s4                   destroyed;
72     s4                   daemon;
73     s4                   nthreads;
74     java_objectheader*   threads;
75     s4                   ngroups;
76     java_objectheader*   groups;
77 } threadGroup;
78
79 /* This structure mirrors java.lang.Thread.h */
80 typedef struct _thread
81 {
82     java_objectheader        header;
83     java_objectheader*       name;
84     s4                       priority;
85     struct _thread*          next;
86     s8                       PrivateInfo;
87     struct java_lang_Object* eetop;           /* ??? */
88     s4                       single_step;
89     s4                       daemon;
90     s4                       stillborn;
91     java_objectheader*       target;
92     s4                       interruptRequested;
93     threadGroup*             group;
94 } thread;
95
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);
106
107 void sleepThread(s8);
108 bool aliveThread(thread*);
109 long framesThread(thread*);
110
111 void reschedule(void);
112
113 void checkEvents(bool block);
114
115 extern int blockInts;
116 extern bool needReschedule;
117 extern thread *currentThread;
118 extern thread *mainThread;
119 extern ctx contexts[];
120 extern int threadStackSize;
121
122 extern thread *liveThreads;
123
124 extern thread *threadQhead[MAX_THREAD_PRIO + 1];
125
126 #define CONTEXT(_t)                                                     \
127         (contexts[(_t)->PrivateInfo - 1])
128
129 #if 1
130 #define intsDisable()   blockInts++
131 #define intsRestore()   if (blockInts == 1 && needReschedule) {         \
132                             reschedule();                               \
133                         }                                               \
134                         blockInts--
135 #else
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) {     \
139                                 reschedule();                           \
140                             }                                           \
141                             blockInts--;                                \
142                             fprintf(stderr, "--: %d (%s:%d)\n", blockInts, __FILE__, __LINE__);     \
143                         } while (0)
144 #endif
145
146 #else
147
148 #define intsDisable()
149 #define intsRestore()
150
151 #endif
152
153 #endif