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