|
|
1.1 root 1: /* HEADER FILE FOR THE TASK SYSTEM */
2:
3: printf(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: {
122: friend timer;
123: friend task;
124: friend object;
125: void schedule(); /* sched clock_task or front of run_chain */
126: void insert(int,object*); /* sched for d time units, ?t_alert=obj */
127: void remove(); /* remove from run_chain & make IDLE */
128:
129: long s_time; /* time to sched; result after cancel() */
130: int s_state; /* IDLE, RUNNING, TERMINATED */
131: public:
132: void print(int);
133:
134: long rdtime() { return s_time; };
135: int rdstate() { return s_state; };
136:
137: void cancel(int);
138: int result();
139: };
140:
141: struct timer : public sched
142: {
143: timer(int);
144: ~timer();
145: void reset(int);
146: void print(int);
147: };
148:
149: extern _hwm;
150: class task : public sched
151: {
152: friend sched;
153: task(char* =0, int =0, int =0);
154: ~task();
155:
156: void save();
157: void restore(); /* swap in new task */
158: int curr_hwm(); /* "high water mark" */
159: /* (how high stack has risen) */
160: int* t_framep; /* WARNING: t_framep
161: is manipulated as an offset
162: by restore()
163: */
164: void* th; /* fudge return from swap */
165: int* t_basep;
166: int t_size; /* holds hwm after cancel() */
167: int* t_savearea; /* for saving stack */
168: int t_trap;
169: team* t_team; /* stack and info for sharing */
170:
171: int t_mode; /* DEDICATED/SHARED stack */
172: int t_stacksize;
173:
174: object* t_alert; /* object that inserted you */
175: public:
176: task* t_next; /* insertion in "task_chain" */
177: char* t_name;
178:
179: int waitvec(object**);
180: int waitlist(object* ...);
181: void wait(object* ob) { (void) waitlist(ob,0); };
182:
183: void delay(int);
184: int preempt();
185: void sleep();
186: void resultis(int);
187: void cancel(int);
188: void swap_stack(int*,int*,int*,int*,int*); /* set fram and restore */
189:
190: void print(int);
191: };
192:
193:
194: /* QUEUE MANIPULATION (see queue.c) */
195: /*
196: qhead <--> oqueue <--> qtail (qhead, qtail independent)
197: oqueue ->> circular queue of objects
198: */
199:
200: /* qh_modes */
201: #define EMODE 1
202: #define WMODE 2
203: #define ZMODE 3
204:
205: class oqueue
206: {
207: friend qhead;
208: friend qtail;
209: int q_max;
210: int q_count;
211: object* q_ptr;
212: qhead* q_head;
213: qtail* q_tail;
214:
215: oqueue(int m) { q_max=m; q_count=0; q_head=0; q_tail=0; };
216: ~oqueue() { (q_count)?task_error(E_QDEL,0):0; };
217: void print(int);
218: };
219:
220: class qhead : public object
221: {
222: friend qtail;
223: qhead(int = WMODE, int = 10000);
224: ~qhead();
225:
226: int qh_mode; /* EMODE,WMODE,ZMODE */
227: oqueue* qh_queue;
228: public:
229: object* get();
230: int putback(object*);
231:
232: int rdcount() { return qh_queue->q_count; }
233: int rdmax() { return qh_queue->q_max; }
234: int rdmode() { return qh_mode; }
235: qtail* tail();
236:
237: qhead* cut();
238: void splice(qtail*);
239:
240: void setmode(int m) { qh_mode = m; };
241: void setmax(int m) { qh_queue->q_max = m; };
242:
243: void print(int);
244: };
245:
246: class qtail : public object
247: {
248: friend qhead;
249: qtail(int = WMODE, int = 10000);
250: ~qtail();
251:
252: int qt_mode;
253: oqueue* qt_queue;
254: public:
255: int put(object*);
256:
257: int rdspace() { return qt_queue->q_max - qt_queue->q_count; };
258: int rdmax() { return qt_queue->q_max; };
259: int rdmode() { return qt_mode; };
260:
261: qtail* cut();
262: void splice(qhead*);
263:
264: qhead* head();
265:
266: void setmode(int m) { qt_mode = m; };
267: void setmax(int m) { qt_queue->q_max = m; };
268:
269: void print(int);
270: };
271:
272:
273: struct histogram
274: /*
275: "nbin" bins covering the range [l:r[ uniformly
276: nbin*binsize == r-l
277: */
278: {
279: int l, r;
280: int binsize;
281: int nbin;
282: int* h;
283: long sum;
284: long sqsum;
285: histogram(int=16, int=0, int=16);
286:
287: void add(int);
288: void print();
289: };
290:
291: /* the result of randint() is always >= 0 */
292:
293: #define DRAW (randx = randx*1103515245 + 12345)
294: #define ABS(x) (x&0x7fffffff)
295:
296: #ifdef pdp11
297: #define MASK(x) ((x>>16)&077777)
298: #define MAX 32768.0
299: #endif
300:
301: #ifdef vax
302: #define MASK(x) ABS(x)
303: #define MAX 2147483648.0
304: #endif
305:
306: class randint
307: /* uniform distribution in the interval [0,MAX] */
308: {
309: long randx;
310: public:
311: randint(long s = 0) { randx=s; }
312: void seed(long s) { randx=s; }
313: int draw() { return MASK(DRAW); }
314: float fdraw() { return ABS(DRAW)/MAX; };
315: };
316:
317: class urand : public randint
318: /* uniform distribution in the interval [low,high] */
319: {
320: public:
321: int low, high;
322: urand(int l, int h) { low=l; high=h; }
323: int draw() { return int(low + (high-low) * (0+randint::draw()/MAX)); }
324: };
325:
326: extern double log(double);
327:
328: class erand : public randint
329: /* exponential distribution random number generator */
330: {
331: public:
332: int mean;
333: erand(int m) { mean=m; };
334: int draw() { return (int)(-mean * log( (double)(MAX-randint::draw())
335: / MAX) + .5); };
336: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.