|
|
1.1 root 1: /* HEADER FILE FOR THE TASK SYSTEM */
2:
3: printf(const char* ...);
4: void exit(int);
5:
6: #define SIZE 750
7: #define MODE DEDICATED
8:
9: class object;
10: class sched; /* : public object */
11: class task; /* : public sched */
12: class qhead; /* : public object */
13: class qtail; /* : public object */
14: class team;
15:
16: extern sched* run_chain; /* list of ready-to-run scheds (ordered by s_time) */
17: extern task* task_chain; /* list of tasks */
18:
19: extern int task_error(int, object*);
20: extern void print_error(int);
21:
22: /* object.o_type */
23: #define TIMER 1
24: #define TASK 2
25: #define QHEAD 4
26: #define QTAIL 5
27:
28: /* sched.s_state */
29: #define IDLE 1
30: #define RUNNING 2
31: #define TERMINATED 4
32:
33: /* type of stack */
34: #define DEDICATED 1
35: #define SHARED 2
36: /* loc on stack */
37: #define UNTOUCHED 052525
38:
39: extern task* clock_task;
40: extern task* thistask;
41: extern long clock;
42: void setclock(long);
43:
44: /* error codes */
45: #define E_OLINK 1
46: #define E_ONEXT 2
47: #define E_GETEMPTY 3
48: #define E_PUTOBJ 4
49: #define E_PUTFULL 5
50: #define E_BACKOBJ 6
51: #define E_BACKFULL 7
52: #define E_SETCLOCK 8
53: #define E_CLOCKIDLE 9
54: #define E_RESTERM 10
55: #define E_RESRUN 11
56: #define E_NEGTIME 12
57: #define E_RESOBJ 13
58: #define E_HISTO 14
59: #define E_STACK 15
60: #define E_STORE 16
61: #define E_TASKMODE 17
62: #define E_TASKDEL 18
63: #define E_TASKPRE 19
64: #define E_TIMERDEL 20
65: #define E_SCHTIME 21
66: #define E_SCHOBJ 22
67: #define E_QDEL 23
68: #define E_RESULT 24
69: #define E_WAIT 25
70: #define MAXERR E_WAIT
71:
72: typedef int (*PFIO)(int,object*);
73: typedef void (*PFV)();
74:
75: extern PFIO error_fct;
76: extern PFV exit_fct;
77:
78: /* print flags */
79: #define CHAIN 1
80: #define VERBOSE 2
81: #define STACK 4
82:
83:
84: /* DATA STRUCTURES */
85: /*
86: object --> olink --> olink ...
87: | | |
88: ... V V
89: | task task
90: V
91: object --> ...
92: */
93:
94: class olink
95: /* the building block for chains of task pointers */
96: {
97: friend object;
98: olink* l_next;
99: task* l_task;
100: olink(task* t, olink* l) { l_task=t; l_next=l; };
101: };
102:
103: class object
104: {
105: olink* o_link;
106: public:
107: object* o_next;
108: int o_type; /* TASK,TIMER,QHEAD/QTAIL */
109:
110: object(int t = 0) { o_type=t; o_link=0; o_next=0; }
111: ~object();
112:
113: void remember(task* t) { o_link = new olink(t,o_link); }
114: void forget(task*); /* remove all occurrences of task from chain */
115: void alert(); /* prepare IDLE tasks for scheduling */
116:
117: void print(int);
118: };
119:
120: class sched : public object {
121: friend timer;
122: friend task;
123: friend object;
124: void schedule(); /* sched clock_task or front of run_chain */
125: void insert(int,object*); /* sched for d time units, ?t_alert=obj */
126: void remove(); /* remove from run_chain & make IDLE */
127:
128: long s_time; /* time to sched; result after cancel() */
129: int s_state; /* IDLE, RUNNING, TERMINATED */
130: public:
131: void print(int);
132:
133: long rdtime() { return s_time; };
134: int rdstate() { return s_state; };
135:
136: void cancel(int);
137: int result();
138: };
139:
140: struct timer : sched {
141: timer(int);
142: ~timer();
143: void reset(int);
144: void print(int);
145: };
146:
147: extern _hwm;
148: class task : public sched {
149: friend sched;
150: void save();
151: void restore(); /* swap in new task */
152: int curr_hwm(); /* "high water mark" */
153: /* (how high stack has risen) */
154: int* t_framep; /* WARNING: t_framep
155: is manipulated as an offset
156: by restore()
157: */
158: void* th; /* fudge return from swap */
159: int* t_basep;
160: int t_size; /* holds hwm after cancel() */
161: int* t_savearea; /* for saving stack */
162: int t_trap;
163: team* t_team; /* stack and info for sharing */
164:
165: int t_mode; /* DEDICATED/SHARED stack */
166: int t_stacksize;
167:
168: object* t_alert; /* object that inserted you */
169: public:
170: task(char* =0, int =0, int =0);
171: ~task();
172:
173: task* t_next; /* insertion in "task_chain" */
174: char* t_name;
175:
176: int waitvec(object**);
177: int waitlist(object* ...);
178: void wait(object* ob) { (void) waitlist(ob,0); };
179:
180: void delay(int);
181: int preempt();
182: void sleep();
183: void resultis(int);
184: void cancel(int);
185: void swap_stack(int*,int*,int*,int*,int*); /* set fram and restore */
186:
187: void print(int);
188: };
189:
190:
191: /* QUEUE MANIPULATION (see queue.c) */
192: /*
193: qhead <--> oqueue <--> qtail (qhead, qtail independent)
194: oqueue ->> circular queue of objects
195: */
196:
197: /* qh_modes */
198: #define EMODE 1
199: #define WMODE 2
200: #define ZMODE 3
201:
202: class oqueue
203: {
204: friend qhead;
205: friend qtail;
206: int q_max;
207: int q_count;
208: object* q_ptr;
209: qhead* q_head;
210: qtail* q_tail;
211:
212: oqueue(int m) { q_max=m; q_count=0; q_head=0; q_tail=0; };
213: ~oqueue() { (q_count)?task_error(E_QDEL,0):0; };
214: void print(int);
215: };
216:
217: class qhead : public object
218: {
219: friend qtail;
220: int qh_mode; /* EMODE,WMODE,ZMODE */
221: oqueue* qh_queue;
222: public:
223: qhead(int = WMODE, int = 10000);
224: ~qhead();
225:
226: object* get();
227: int putback(object*);
228:
229: int rdcount() { return qh_queue->q_count; }
230: int rdmax() { return qh_queue->q_max; }
231: int rdmode() { return qh_mode; }
232: qtail* tail();
233:
234: qhead* cut();
235: void splice(qtail*);
236:
237: void setmode(int m) { qh_mode = m; };
238: void setmax(int m) { qh_queue->q_max = m; };
239:
240: void print(int);
241: };
242:
243: class qtail : public object
244: {
245: friend qhead;
246: int qt_mode;
247: oqueue* qt_queue;
248: public:
249: qtail(int = WMODE, int = 10000);
250: ~qtail();
251:
252: int put(object*);
253:
254: int rdspace() { return qt_queue->q_max - qt_queue->q_count; };
255: int rdmax() { return qt_queue->q_max; };
256: int rdmode() { return qt_mode; };
257:
258: qtail* cut();
259: void splice(qhead*);
260:
261: qhead* head();
262:
263: void setmode(int m) { qt_mode = m; };
264: void setmax(int m) { qt_queue->q_max = m; };
265:
266: void print(int);
267: };
268:
269:
270: struct histogram
271: /*
272: "nbin" bins covering the range [l:r[ uniformly
273: nbin*binsize == r-l
274: */
275: {
276: int l, r;
277: int binsize;
278: int nbin;
279: int* h;
280: long sum;
281: long sqsum;
282: histogram(int=16, int=0, int=16);
283:
284: void add(int);
285: void print();
286: };
287:
288: /* the result of randint() is always >= 0 */
289:
290: #define DRAW (randx = randx*1103515245 + 12345)
291: #define ABS(x) (x&0x7fffffff)
292:
293: #ifdef pdp11
294: #define MASK(x) ((x>>16)&077777)
295: #define MAX 32768.0
296: #endif
297:
298: #ifdef vax
299: #define MASK(x) ABS(x)
300: #define MAX 2147483648.0
301: #endif
302:
303: class randint
304: /* uniform distribution in the interval [0,MAX] */
305: {
306: long randx;
307: public:
308: randint(long s = 0) { randx=s; }
309: void seed(long s) { randx=s; }
310: int draw() { return MASK(DRAW); }
311: float fdraw() { return ABS(DRAW)/MAX; };
312: };
313:
314: class urand : public randint
315: /* uniform distribution in the interval [low,high] */
316: {
317: public:
318: int low, high;
319: urand(int l, int h) { low=l; high=h; }
320: int draw() { return int(low + (high-low) * (0+randint::draw()/MAX)); }
321: };
322:
323: extern double log(double);
324:
325: class erand : public randint
326: /* exponential distribution random number generator */
327: {
328: public:
329: int mean;
330: erand(int m) { mean=m; };
331: int draw() { return (int)(-mean * log( (double)(MAX-randint::draw())
332: / MAX) + .5); };
333: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.