1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4 
5 typedef	struct	WaitQ	WaitQ;
6 typedef	struct	SudoG	SudoG;
7 typedef	struct	Select	Select;
8 typedef	struct	Scase	Scase;
9 
10 typedef struct	__go_type_descriptor	Type;
11 typedef struct	__go_channel_type	ChanType;
12 
13 struct	SudoG
14 {
15 	G*	g;
16 	uint32*	selectdone;
17 	SudoG*	link;
18 	int64	releasetime;
19 	byte*	elem;		// data element
20 };
21 
22 struct	WaitQ
23 {
24 	SudoG*	first;
25 	SudoG*	last;
26 };
27 
28 // The garbage collector is assuming that Hchan can only contain pointers into the stack
29 // and cannot contain pointers into the heap.
30 struct	Hchan
31 {
32 	uintgo	qcount;			// total data in the q
33 	uintgo	dataqsiz;		// size of the circular q
34 	uint16	elemsize;
35 	uint16	pad;			// ensures proper alignment of the buffer that follows Hchan in memory
36 	bool	closed;
37 	const Type* elemtype;		// element type
38 	uintgo	sendx;			// send index
39 	uintgo	recvx;			// receive index
40 	WaitQ	recvq;			// list of recv waiters
41 	WaitQ	sendq;			// list of send waiters
42 	Lock;
43 };
44 
45 // Buffer follows Hchan immediately in memory.
46 // chanbuf(c, i) is pointer to the i'th slot in the buffer.
47 #define chanbuf(c, i) ((byte*)((c)+1)+(uintptr)(c)->elemsize*(i))
48 
49 enum
50 {
51 	debug = 0,
52 
53 	// Scase.kind
54 	CaseRecv,
55 	CaseSend,
56 	CaseDefault,
57 };
58 
59 struct	Scase
60 {
61 	SudoG	sg;			// must be first member (cast to Scase)
62 	Hchan*	chan;			// chan
63 	uint16	kind;
64 	uint16	index;			// index to return
65 	bool*	receivedp;		// pointer to received bool (recv2)
66 };
67 
68 struct	Select
69 {
70 	uint16	tcase;			// total count of scase[]
71 	uint16	ncase;			// currently filled scase[]
72 	uint16*	pollorder;		// case poll order
73 	Hchan**	lockorder;		// channel lock order
74 	Scase	scase[1];		// one per case (in order of appearance)
75 };
76