if cv.TryRecv() != nil {
t.Errorf("TryRecv on sync chan succeeded");
}
+
+ // len/cap
+ cv = MakeChan(Typeof(c).(*ChanType), 10);
+ c = cv.Interface().(chan int);
+ for i := 0; i < 3; i++ {
+ c <- i;
+ }
+ if l, m := cv.Len(), cv.Cap(); l != len(c) || m != cap(c) {
+ t.Errorf("Len/Cap = %d/%d want %d/%d", l, m, len(c), cap(c));
+ }
+
}
// Difficult test for function call because of
func chanrecv(ch, val *byte, pres *bool)
func chanclosed(ch *byte) bool
func chanclose(ch *byte)
+func chanlen(ch *byte) int32
+func chancap(ch *byte) int32
// Closed returns the result of closed(c) on the underlying channel.
func (v *ChanValue) Closed() bool {
chanclose(ch);
}
+func (v *ChanValue) Len() int {
+ ch := *(**byte)(v.addr);
+ return int(chanlen(ch));
+}
+
+func (v *ChanValue) Cap() int {
+ ch := *(**byte)(v.addr);
+ return int(chancap(ch));
+}
+
// internal send; non-blocking if b != nil
func (v *ChanValue) send(x Value, b *bool) {
t := v.Type().(*ChanType);
return (c->closed & Rclosed) != 0;
}
+int32
+chanlen(Hchan *c)
+{
+ return c->qcount;
+}
+
+int32
+chancap(Hchan *c)
+{
+ return c->dataqsiz;
+}
+
// closedchan(sel *byte) bool;
void
r = chanclosed((Hchan*)ch);
}
+func chanlen(ch *byte) (r int32) {
+ r = chanlen((Hchan*)ch);
+}
+
+func chancap(ch *byte) (r int32) {
+ r = chancap((Hchan*)ch);
+}
+
/*
* Go wrappers around the functions in iface.c
void chanrecv(Hchan*, void*, bool*);
void chanclose(Hchan*);
bool chanclosed(Hchan*);
+int32 chanlen(Hchan*);
+int32 chancap(Hchan*);
void ifaceE2I(struct InterfaceType*, Eface, Iface*);