diff options
Diffstat (limited to 'src/runtime/chan1.go')
-rw-r--r-- | src/runtime/chan1.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/runtime/chan1.go b/src/runtime/chan1.go new file mode 100644 index 000000000..000775b1e --- /dev/null +++ b/src/runtime/chan1.go @@ -0,0 +1,61 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package runtime + +import "unsafe" + +//#define MAXALIGN 8 + +type waitq struct { + first *sudog + last *sudog +} + +type hchan struct { + qcount uint // total data in the q + dataqsiz uint // size of the circular q + buf *byte + elemsize uint16 + closed uint32 + elemtype *_type // element type + sendx uint // send index + recvx uint // receive index + recvq waitq // list of recv waiters + sendq waitq // list of send waiters + lock mutex +} + +// Buffer follows Hchan immediately in memory. +// chanbuf(c, i) is pointer to the i'th slot in the buffer. +// #define chanbuf(c, i) ((byte*)((c)->buf)+(uintptr)(c)->elemsize*(i)) + +const ( + // scase.kind + _CaseRecv = iota + _CaseSend + _CaseDefault +) + +// Known to compiler. +// Changes here must also be made in src/cmd/gc/select.c's selecttype. +type scase struct { + elem unsafe.Pointer // data element + _chan *hchan // chan + pc uintptr // return pc + kind uint16 + so uint16 // vararg of selected bool + receivedp *bool // pointer to received bool (recv2) + releasetime int64 +} + +// Known to compiler. +// Changes here must also be made in src/cmd/gc/select.c's selecttype. +type _select struct { + tcase uint16 // total count of scase[] + ncase uint16 // currently filled scase[] + pollorder *uint16 // case poll order + lockorder **hchan // channel lock order + scase [1]scase // one per case (in order of appearance) +} |