Makes a copy of the bytes we read from stdin and sends those to the
processing goroutine instead of a slice from our scratch buffer. This
avoids sharing the same underlying array data across goroutines.
This commit is contained in:
Brett Buddin 2017-09-29 21:56:33 -04:00
parent 9f21b09785
commit 4a8c31c50e

@ -12,6 +12,8 @@ import (
const ( const (
logfile = "/tmp/go-prompt-debug.log" logfile = "/tmp/go-prompt-debug.log"
envEnableLog = "GO_PROMPT_ENABLE_LOG" envEnableLog = "GO_PROMPT_ENABLE_LOG"
maxReadBytes = 1024
) )
// Executor is called when user input something text. // Executor is called when user input something text.
@ -249,7 +251,7 @@ func (p *Prompt) tearDown() {
} }
func readBuffer(bufCh chan []byte, stopCh chan struct{}) { func readBuffer(bufCh chan []byte, stopCh chan struct{}) {
buf := make([]byte, 1024) buf := make([]byte, maxReadBytes)
log.Printf("[INFO] readBuffer start") log.Printf("[INFO] readBuffer start")
for { for {
@ -260,7 +262,9 @@ func readBuffer(bufCh chan []byte, stopCh chan struct{}) {
return return
default: default:
if n, err := syscall.Read(syscall.Stdin, buf); err == nil { if n, err := syscall.Read(syscall.Stdin, buf); err == nil {
bufCh <- buf[:n] cbuf := make([]byte, n)
copy(cbuf, buf[:n])
bufCh <- cbuf
} }
} }
} }
@ -278,7 +282,7 @@ func handleSignals(in ConsoleParser, exitCh chan int, winSizeCh chan *WinSize, s
for { for {
select { select {
case <- stop: case <-stop:
log.Println("[INFO] stop handleSignals") log.Println("[INFO] stop handleSignals")
return return
case s := <-sigCh: case s := <-sigCh: