xref: /plan9-contrib/sys/src/libthread/sched.acid (revision b94bb474148e9d24a82a427863d9c9eb4c20f4ae)
1sizeof_1_ = 8;
2aggr _1_
3{
4	'U' 0 lo;
5	'U' 4 hi;
6};
7
8defn
9_1_(addr) {
10	complex _1_ addr;
11	print("	lo	", addr.lo, "\n");
12	print("	hi	", addr.hi, "\n");
13};
14
15sizeofFPdbleword = 8;
16aggr FPdbleword
17{
18	'F' 0 x;
19	{
20	'U' 0 lo;
21	'U' 4 hi;
22	};
23};
24
25defn
26FPdbleword(addr) {
27	complex FPdbleword addr;
28	print("	x	", addr.x, "\n");
29	print("_1_ {\n");
30		_1_(addr+0);
31	print("}\n");
32};
33
34UTFmax = 3;
35Runesync = 128;
36Runeself = 128;
37Runeerror = 65533;
38sizeofFmt = 48;
39aggr Fmt
40{
41	'b' 0 runes;
42	'X' 4 start;
43	'X' 8 to;
44	'X' 12 stop;
45	'X' 16 flush;
46	'X' 20 farg;
47	'D' 24 nfmt;
48	'X' 28 args;
49	'D' 32 r;
50	'D' 36 width;
51	'D' 40 prec;
52	'U' 44 flags;
53};
54
55defn
56Fmt(addr) {
57	complex Fmt addr;
58	print("	runes	", addr.runes, "\n");
59	print("	start	", addr.start\X, "\n");
60	print("	to	", addr.to\X, "\n");
61	print("	stop	", addr.stop\X, "\n");
62	print("	flush	", addr.flush\X, "\n");
63	print("	farg	", addr.farg\X, "\n");
64	print("	nfmt	", addr.nfmt, "\n");
65	print("	args	", addr.args\X, "\n");
66	print("	r	", addr.r, "\n");
67	print("	width	", addr.width, "\n");
68	print("	prec	", addr.prec, "\n");
69	print("	flags	", addr.flags, "\n");
70};
71
72FmtWidth = 1;
73FmtLeft = 2;
74FmtPrec = 4;
75FmtSharp = 8;
76FmtSpace = 16;
77FmtSign = 32;
78FmtZero = 64;
79FmtUnsigned = 128;
80FmtShort = 256;
81FmtLong = 512;
82FmtVLong = 1024;
83FmtComma = 2048;
84FmtByte = 4096;
85FmtFlag = 8192;
86sizeofTm = 40;
87aggr Tm
88{
89	'D' 0 sec;
90	'D' 4 min;
91	'D' 8 hour;
92	'D' 12 mday;
93	'D' 16 mon;
94	'D' 20 year;
95	'D' 24 wday;
96	'D' 28 yday;
97	'a' 32 zone;
98	'D' 36 tzoff;
99};
100
101defn
102Tm(addr) {
103	complex Tm addr;
104	print("	sec	", addr.sec, "\n");
105	print("	min	", addr.min, "\n");
106	print("	hour	", addr.hour, "\n");
107	print("	mday	", addr.mday, "\n");
108	print("	mon	", addr.mon, "\n");
109	print("	year	", addr.year, "\n");
110	print("	wday	", addr.wday, "\n");
111	print("	yday	", addr.yday, "\n");
112	print("	zone	", addr.zone, "\n");
113	print("	tzoff	", addr.tzoff, "\n");
114};
115
116PNPROC = 1;
117PNGROUP = 2;
118Profoff = 0;
119Profuser = 1;
120Profkernel = 2;
121Proftime = 3;
122Profsample = 4;
123sizeofLock = 4;
124aggr Lock
125{
126	'D' 0 val;
127};
128
129defn
130Lock(addr) {
131	complex Lock addr;
132	print("	val	", addr.val, "\n");
133};
134
135sizeofQLp = 12;
136aggr QLp
137{
138	'D' 0 inuse;
139	'A' QLp 4 next;
140	'C' 8 state;
141};
142
143defn
144QLp(addr) {
145	complex QLp addr;
146	print("	inuse	", addr.inuse, "\n");
147	print("	next	", addr.next\X, "\n");
148	print("	state	", addr.state, "\n");
149};
150
151sizeofQLock = 16;
152aggr QLock
153{
154	Lock 0 lock;
155	'D' 4 locked;
156	'A' QLp 8 $head;
157	'A' QLp 12 $tail;
158};
159
160defn
161QLock(addr) {
162	complex QLock addr;
163	print("Lock lock {\n");
164	Lock(addr.lock);
165	print("}\n");
166	print("	locked	", addr.locked, "\n");
167	print("	$head	", addr.$head\X, "\n");
168	print("	$tail	", addr.$tail\X, "\n");
169};
170
171sizeofRWLock = 20;
172aggr RWLock
173{
174	Lock 0 lock;
175	'D' 4 readers;
176	'D' 8 writer;
177	'A' QLp 12 $head;
178	'A' QLp 16 $tail;
179};
180
181defn
182RWLock(addr) {
183	complex RWLock addr;
184	print("Lock lock {\n");
185	Lock(addr.lock);
186	print("}\n");
187	print("	readers	", addr.readers, "\n");
188	print("	writer	", addr.writer, "\n");
189	print("	$head	", addr.$head\X, "\n");
190	print("	$tail	", addr.$tail\X, "\n");
191};
192
193sizeofRendez = 12;
194aggr Rendez
195{
196	'A' QLock 0 l;
197	'A' QLp 4 $head;
198	'A' QLp 8 $tail;
199};
200
201defn
202Rendez(addr) {
203	complex Rendez addr;
204	print("	l	", addr.l\X, "\n");
205	print("	$head	", addr.$head\X, "\n");
206	print("	$tail	", addr.$tail\X, "\n");
207};
208
209sizeofNetConnInfo = 36;
210aggr NetConnInfo
211{
212	'X' 0 dir;
213	'X' 4 root;
214	'X' 8 spec;
215	'X' 12 lsys;
216	'X' 16 lserv;
217	'X' 20 rsys;
218	'X' 24 rserv;
219	'X' 28 laddr;
220	'X' 32 raddr;
221};
222
223defn
224NetConnInfo(addr) {
225	complex NetConnInfo addr;
226	print("	dir	", addr.dir\X, "\n");
227	print("	root	", addr.root\X, "\n");
228	print("	spec	", addr.spec\X, "\n");
229	print("	lsys	", addr.lsys\X, "\n");
230	print("	lserv	", addr.lserv\X, "\n");
231	print("	rsys	", addr.rsys\X, "\n");
232	print("	rserv	", addr.rserv\X, "\n");
233	print("	laddr	", addr.laddr\X, "\n");
234	print("	raddr	", addr.raddr\X, "\n");
235};
236
237RFNAMEG = 1;
238RFENVG = 2;
239RFFDG = 4;
240RFNOTEG = 8;
241RFPROC = 16;
242RFMEM = 32;
243RFNOWAIT = 64;
244RFCNAMEG = 1024;
245RFCENVG = 2048;
246RFCFDG = 4096;
247RFREND = 8192;
248RFNOMNT = 16384;
249sizeofQid = 16;
250aggr Qid
251{
252	'W' 0 path;
253	'U' 8 vers;
254	'b' 12 type;
255};
256
257defn
258Qid(addr) {
259	complex Qid addr;
260	print("	path	", addr.path, "\n");
261	print("	vers	", addr.vers, "\n");
262	print("	type	", addr.type, "\n");
263};
264
265sizeofDir = 60;
266aggr Dir
267{
268	'u' 0 type;
269	'U' 4 dev;
270	Qid 8 qid;
271	'U' 24 mode;
272	'U' 28 atime;
273	'U' 32 mtime;
274	'V' 36 length;
275	'X' 44 name;
276	'X' 48 uid;
277	'X' 52 gid;
278	'X' 56 muid;
279};
280
281defn
282Dir(addr) {
283	complex Dir addr;
284	print("	type	", addr.type, "\n");
285	print("	dev	", addr.dev, "\n");
286	print("Qid qid {\n");
287	Qid(addr.qid);
288	print("}\n");
289	print("	mode	", addr.mode, "\n");
290	print("	atime	", addr.atime, "\n");
291	print("	mtime	", addr.mtime, "\n");
292	print("	length	", addr.length, "\n");
293	print("	name	", addr.name\X, "\n");
294	print("	uid	", addr.uid\X, "\n");
295	print("	gid	", addr.gid\X, "\n");
296	print("	muid	", addr.muid\X, "\n");
297};
298
299sizeofWaitmsg = 20;
300aggr Waitmsg
301{
302	'D' 0 pid;
303	'a' 4 time;
304	'X' 16 msg;
305};
306
307defn
308Waitmsg(addr) {
309	complex Waitmsg addr;
310	print("	pid	", addr.pid, "\n");
311	print("	time	", addr.time, "\n");
312	print("	msg	", addr.msg\X, "\n");
313};
314
315sizeofIOchunk = 8;
316aggr IOchunk
317{
318	'X' 0 addr;
319	'U' 4 len;
320};
321
322defn
323IOchunk(addr) {
324	complex IOchunk addr;
325	print("	addr	", addr.addr\X, "\n");
326	print("	len	", addr.len, "\n");
327};
328
329Nqwds = 2;
330Nqshift = 5;
331Nqmask = -1;
332Nqbits = 64;
333sizeofChannel = 36;
334aggr Channel
335{
336	'D' 0 s;
337	'U' 4 f;
338	'U' 8 n;
339	'D' 12 e;
340	'D' 16 freed;
341	'X' 20 qentry;
342	'D' 24 nentry;
343	'D' 28 closed;
344	'a' 32 v;
345};
346
347defn
348Channel(addr) {
349	complex Channel addr;
350	print("	s	", addr.s, "\n");
351	print("	f	", addr.f, "\n");
352	print("	n	", addr.n, "\n");
353	print("	e	", addr.e, "\n");
354	print("	freed	", addr.freed, "\n");
355	print("	qentry	", addr.qentry\X, "\n");
356	print("	nentry	", addr.nentry, "\n");
357	print("	closed	", addr.closed, "\n");
358	print("	v	", addr.v, "\n");
359};
360
361CHANEND = 0;
362CHANSND = 1;
363CHANRCV = 2;
364CHANNOP = 3;
365CHANNOBLK = 4;
366sizeofAlt = 24;
367aggr Alt
368{
369	'A' Channel 0 c;
370	'X' 4 v;
371	'D' 8 op;
372	'X' 12 err;
373	'A' Channel 16 tag;
374	'D' 20 entryno;
375};
376
377defn
378Alt(addr) {
379	complex Alt addr;
380	print("	c	", addr.c\X, "\n");
381	print("	v	", addr.v\X, "\n");
382	print("	op	", addr.op, "\n");
383	print("	err	", addr.err\X, "\n");
384	print("	tag	", addr.tag\X, "\n");
385	print("	entryno	", addr.entryno, "\n");
386};
387
388sizeofRef = 4;
389aggr Ref
390{
391	'D' 0 ref;
392};
393
394defn
395Ref(addr) {
396	complex Ref addr;
397	print("	ref	", addr.ref, "\n");
398};
399
400Dead = 0;
401Running = 1;
402Ready = 2;
403Rendezvous = 3;
404Channone = 0;
405Chanalt = 1;
406Chansend = 2;
407Chanrecv = 3;
408RENDHASH = 13;
409Printsize = 2048;
410NPRIV = 8;
411sizeofRgrp = 56;
412aggr Rgrp
413{
414	Lock 0 lock;
415	'a' 4 hash;
416};
417
418defn
419Rgrp(addr) {
420	complex Rgrp addr;
421	print("Lock lock {\n");
422	Lock(addr.lock);
423	print("}\n");
424	print("	hash	", addr.hash, "\n");
425};
426
427sizeofTqueue = 12;
428aggr Tqueue
429{
430	'D' 0 asleep;
431	'X' 4 $head;
432	'X' 8 $tail;
433};
434
435defn
436Tqueue(addr) {
437	complex Tqueue addr;
438	print("	asleep	", addr.asleep, "\n");
439	print("	$head	", addr.$head\X, "\n");
440	print("	$tail	", addr.$tail\X, "\n");
441};
442
443sizeofThread = 120;
444aggr Thread
445{
446	Lock 0 lock;
447	'a' 4 sched;
448	'D' 12 id;
449	'D' 16 grp;
450	'D' 20 moribund;
451	'D' 24 state;
452	'D' 28 nextstate;
453	'X' 32 stk;
454	'U' 36 stksize;
455	'A' Thread 40 next;
456	'X' 44 proc;
457	'A' Thread 48 nextt;
458	'D' 52 ret;
459	'X' 56 cmdname;
460	'D' 60 inrendez;
461	'A' Thread 64 rendhash;
462	'X' 68 rendtag;
463	'X' 72 rendval;
464	'D' 76 rendbreak;
465	'D' 80 chan;
466	'A' Alt 84 alt;
467	'a' 88 udata;
468};
469
470defn
471Thread(addr) {
472	complex Thread addr;
473	print("Lock lock {\n");
474	Lock(addr.lock);
475	print("}\n");
476	print("	sched	", addr.sched, "\n");
477	print("	id	", addr.id, "\n");
478	print("	grp	", addr.grp, "\n");
479	print("	moribund	", addr.moribund, "\n");
480	print("	state	", addr.state, "\n");
481	print("	nextstate	", addr.nextstate, "\n");
482	print("	stk	", addr.stk\X, "\n");
483	print("	stksize	", addr.stksize, "\n");
484	print("	next	", addr.next\X, "\n");
485	print("	proc	", addr.proc\X, "\n");
486	print("	nextt	", addr.nextt\X, "\n");
487	print("	ret	", addr.ret, "\n");
488	print("	cmdname	", addr.cmdname\X, "\n");
489	print("	inrendez	", addr.inrendez, "\n");
490	print("	rendhash	", addr.rendhash\X, "\n");
491	print("	rendtag	", addr.rendtag\X, "\n");
492	print("	rendval	", addr.rendval\X, "\n");
493	print("	rendbreak	", addr.rendbreak, "\n");
494	print("	chan	", addr.chan, "\n");
495	print("	alt	", addr.alt\X, "\n");
496	print("	udata	", addr.udata, "\n");
497};
498
499sizeofExecargs = 16;
500aggr Execargs
501{
502	'X' 0 prog;
503	'X' 4 args;
504	'a' 8 fd;
505};
506
507defn
508Execargs(addr) {
509	complex Execargs addr;
510	print("	prog	", addr.prog\X, "\n");
511	print("	args	", addr.args\X, "\n");
512	print("	fd	", addr.fd, "\n");
513};
514
515sizeofProc = 2424;
516aggr Proc
517{
518	Lock 0 lock;
519	'a' 4 sched;
520	'D' 12 pid;
521	'D' 16 splhi;
522	'A' Thread 20 thread;
523	'D' 24 needexec;
524	Execargs 28 exec;
525	'A' Proc 44 newproc;
526	'a' 48 exitstr;
527	'D' 176 rforkflag;
528	'D' 180 nthreads;
529	Tqueue 184 threads;
530	Tqueue 196 ready;
531	Lock 208 readylock;
532	'a' 212 printbuf;
533	'D' 2260 blocked;
534	'D' 2264 pending;
535	'D' 2268 nonotes;
536	'U' 2272 nextID;
537	'A' Proc 2276 next;
538	'X' 2280 arg;
539	'a' 2284 str;
540	'X' 2412 wdata;
541	'X' 2416 udata;
542	'C' 2420 threadint;
543};
544
545defn
546Proc(addr) {
547	complex Proc addr;
548	print("Lock lock {\n");
549	Lock(addr.lock);
550	print("}\n");
551	print("	sched	", addr.sched, "\n");
552	print("	pid	", addr.pid, "\n");
553	print("	splhi	", addr.splhi, "\n");
554	print("	thread	", addr.thread\X, "\n");
555	print("	needexec	", addr.needexec, "\n");
556	print("Execargs exec {\n");
557	Execargs(addr.exec);
558	print("}\n");
559	print("	newproc	", addr.newproc\X, "\n");
560	print("	exitstr	", addr.exitstr, "\n");
561	print("	rforkflag	", addr.rforkflag, "\n");
562	print("	nthreads	", addr.nthreads, "\n");
563	print("Tqueue threads {\n");
564	Tqueue(addr.threads);
565	print("}\n");
566	print("Tqueue ready {\n");
567	Tqueue(addr.ready);
568	print("}\n");
569	print("Lock readylock {\n");
570	Lock(addr.readylock);
571	print("}\n");
572	print("	printbuf	", addr.printbuf, "\n");
573	print("	blocked	", addr.blocked, "\n");
574	print("	pending	", addr.pending, "\n");
575	print("	nonotes	", addr.nonotes, "\n");
576	print("	nextID	", addr.nextID, "\n");
577	print("	next	", addr.next\X, "\n");
578	print("	arg	", addr.arg\X, "\n");
579	print("	str	", addr.str, "\n");
580	print("	wdata	", addr.wdata\X, "\n");
581	print("	udata	", addr.udata\X, "\n");
582	print("	threadint	", addr.threadint, "\n");
583};
584
585sizeofPqueue = 12;
586aggr Pqueue
587{
588	Lock 0 lock;
589	'A' Proc 4 $head;
590	'A' Proc 8 $tail;
591};
592
593defn
594Pqueue(addr) {
595	complex Pqueue addr;
596	print("Lock lock {\n");
597	Lock(addr.lock);
598	print("}\n");
599	print("	$head	", addr.$head\X, "\n");
600	print("	$tail	", addr.$tail\X, "\n");
601};
602
603sizeofIoproc = 160;
604aggr Ioproc
605{
606	'D' 0 tid;
607	'A' Channel 4 c;
608	'A' Channel 8 creply;
609	'D' 12 inuse;
610	'X' 16 op;
611	'X' 20 arg;
612	'D' 24 ret;
613	'a' 28 err;
614	'A' Ioproc 156 next;
615};
616
617defn
618Ioproc(addr) {
619	complex Ioproc addr;
620	print("	tid	", addr.tid, "\n");
621	print("	c	", addr.c\X, "\n");
622	print("	creply	", addr.creply\X, "\n");
623	print("	inuse	", addr.inuse, "\n");
624	print("	op	", addr.op\X, "\n");
625	print("	arg	", addr.arg\X, "\n");
626	print("	ret	", addr.ret, "\n");
627	print("	err	", addr.err, "\n");
628	print("	next	", addr.next\X, "\n");
629};
630
631complex Pqueue _threadpq;
632complex Channel _threadwaitchan;
633complex Rgrp _threadrgrp;
634sizeof_2_ = 24;
635aggr _2_
636{
637	'X' 0 pp;
638	'X' 4 next;
639	'X' 8 last;
640	'X' 12 first;
641	'U' 16 pid;
642	'U' 20 what;
643};
644
645defn
646_2_(addr) {
647	complex _2_ addr;
648	print("	pp	", addr.pp\X, "\n");
649	print("	next	", addr.next\X, "\n");
650	print("	last	", addr.last\X, "\n");
651	print("	first	", addr.first\X, "\n");
652	print("	pid	", addr.pid, "\n");
653	print("	what	", addr.what, "\n");
654};
655
656sizeofTos = 56;
657aggr Tos
658{
659	_2_ 0 prof;
660	'W' 24 cyclefreq;
661	'V' 32 kcycles;
662	'V' 40 pcycles;
663	'U' 48 pid;
664	'U' 52 clock;
665};
666
667defn
668Tos(addr) {
669	complex Tos addr;
670	print("_2_ prof {\n");
671	_2_(addr.prof);
672	print("}\n");
673	print("	cyclefreq	", addr.cyclefreq, "\n");
674	print("	kcycles	", addr.kcycles, "\n");
675	print("	pcycles	", addr.pcycles, "\n");
676	print("	pid	", addr.pid, "\n");
677	print("	clock	", addr.clock, "\n");
678};
679
680complex Tos _tos;
681complex Proc _schedinit:p;
682complex Thread _schedinit:t;
683complex Thread _schedinit:l;
684complex Proc needstack:p;
685complex Thread needstack:t;
686complex Proc _sched:p;
687complex Thread _sched:t;
688complex Proc runthread:p;
689complex Thread runthread:t;
690complex Tqueue runthread:q;
691complex Thread _threadready:t;
692complex Tqueue _threadready:q;
693