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