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