mirror of
https://github.com/golang/go
synced 2024-11-21 22:44:40 -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,7 +1024,8 @@ syncsend:
|
||||
selunlock(sel);
|
||||
if(debug)
|
||||
runtime·printf("syncsend: sel=%p c=%p o=%d\n", sel, c, o);
|
||||
c->elemalg->copy(c->elemsize, sg->elem, cas->sg.elem);
|
||||
if(sg->elem != nil)
|
||||
c->elemalg->copy(c->elemsize, sg->elem, cas->sg.elem);
|
||||
gp = sg->g;
|
||||
gp->param = sg;
|
||||
runtime·ready(gp);
|
||||
|
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