// 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) }