mirror of
https://github.com/golang/go.git
synced 2025-05-08 00:53:07 +00:00
Scheduling values after calls to selectrecv, will cause them to be executed multiple times, due to runtime.selectgo jumping to the next instruction in the selectrecv basic block. Prevent this by scheduling calls to selectrecv as late as possible Fixes #19201 Change-Id: I6415792e2c465dc6d9bd6583ba1e54b107bcf5cc Reviewed-on: https://go-review.googlesource.com/38587 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
53 lines
765 B
Go
53 lines
765 B
Go
// run
|
|
|
|
// Copyright 2017 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 main
|
|
|
|
import (
|
|
"encoding/binary"
|
|
)
|
|
|
|
var (
|
|
ch1 = make(chan int)
|
|
ch2 = make(chan int)
|
|
|
|
bin = []byte("a\000\000\001")
|
|
want = binary.BigEndian.Uint32(bin)
|
|
|
|
c consumer = noopConsumer{}
|
|
)
|
|
|
|
type msg struct {
|
|
code uint32
|
|
}
|
|
|
|
type consumer interface {
|
|
consume(msg)
|
|
}
|
|
|
|
type noopConsumer struct{}
|
|
|
|
func (noopConsumer) consume(msg) {}
|
|
|
|
func init() {
|
|
close(ch1)
|
|
}
|
|
|
|
func main() {
|
|
var m msg
|
|
m.code = binary.BigEndian.Uint32(bin)
|
|
|
|
select {
|
|
case <-ch1:
|
|
c.consume(m)
|
|
if m.code != want {
|
|
// can not use m.code here, or it will work
|
|
panic("BigEndian read failed")
|
|
}
|
|
case <-ch2:
|
|
}
|
|
}
|