mirror of
https://github.com/golang/go
synced 2024-11-22 04:14:42 -07:00
runtime: check for nil value pointer in select syncsend case
Fixes #2309. R=rsc, bradfitz CC=golang-dev https://golang.org/cl/5128053
This commit is contained in:
parent
9c643bb3fa
commit
45301ba8c0
@ -1024,6 +1024,7 @@ syncsend:
|
|||||||
selunlock(sel);
|
selunlock(sel);
|
||||||
if(debug)
|
if(debug)
|
||||||
runtime·printf("syncsend: sel=%p c=%p o=%d\n", sel, c, o);
|
runtime·printf("syncsend: sel=%p c=%p o=%d\n", sel, c, o);
|
||||||
|
if(sg->elem != nil)
|
||||||
c->elemalg->copy(c->elemsize, sg->elem, cas->sg.elem);
|
c->elemalg->copy(c->elemsize, sg->elem, cas->sg.elem);
|
||||||
gp = sg->g;
|
gp = sg->g;
|
||||||
gp->param = sg;
|
gp->param = sg;
|
||||||
|
68
test/chan/select7.go
Normal file
68
test/chan/select7.go
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
// $G $D/$F.go && $L $F.$A && ./$A.out
|
||||||
|
|
||||||
|
// Copyright 2011 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.
|
||||||
|
|
||||||
|
// Test select when discarding a value.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "runtime"
|
||||||
|
|
||||||
|
func recv1(c <-chan int) {
|
||||||
|
<-c
|
||||||
|
}
|
||||||
|
|
||||||
|
func recv2(c <-chan int) {
|
||||||
|
select {
|
||||||
|
case <-c:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func recv3(c <-chan int) {
|
||||||
|
c2 := make(chan int)
|
||||||
|
select {
|
||||||
|
case <-c:
|
||||||
|
case <-c2:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func send1(recv func(<-chan int)) {
|
||||||
|
c := make(chan int)
|
||||||
|
go recv(c)
|
||||||
|
runtime.Gosched()
|
||||||
|
c <- 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func send2(recv func(<-chan int)) {
|
||||||
|
c := make(chan int)
|
||||||
|
go recv(c)
|
||||||
|
runtime.Gosched()
|
||||||
|
select {
|
||||||
|
case c <- 1:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func send3(recv func(<-chan int)) {
|
||||||
|
c := make(chan int)
|
||||||
|
go recv(c)
|
||||||
|
runtime.Gosched()
|
||||||
|
c2 := make(chan int)
|
||||||
|
select {
|
||||||
|
case c <- 1:
|
||||||
|
case c2 <- 1:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
send1(recv1)
|
||||||
|
send2(recv1)
|
||||||
|
send3(recv1)
|
||||||
|
send1(recv2)
|
||||||
|
send2(recv2)
|
||||||
|
send3(recv2)
|
||||||
|
send1(recv3)
|
||||||
|
send2(recv3)
|
||||||
|
send3(recv3)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user