Skip to content

Instantly share code, notes, and snippets.

@calavera
Last active February 26, 2016 19:02
Show Gist options
  • Save calavera/7d52bbfd677f898f8145 to your computer and use it in GitHub Desktop.
Save calavera/7d52bbfd677f898f8145 to your computer and use it in GitHub Desktop.
package main
import (
"bytes"
"log"
"os"
"sync"
"github.com/docker/docker/pkg/stdcopy"
)
type concurrentSafeBuffer struct {
*bytes.Buffer
m *sync.Mutex
}
func (c *concurrentSafeBuffer) Write(p []byte) (n int, err error) {
c.m.Lock()
n, err = c.Buffer.Write(p)
c.m.Unlock()
return
}
func (c *concurrentSafeBuffer) Read(p []byte) (n int, err error) {
c.m.Lock()
n, err = c.Buffer.Read(p)
c.m.Unlock()
return
}
func main() {
stdcopystream := &concurrentSafeBuffer{
Buffer: new(bytes.Buffer),
m: new(sync.Mutex),
}
go func() {
_, err := stdcopy.StdCopy(os.Stdout, os.Stderr, stdcopystream)
log.Fatal(err)
}()
outStream := stdcopy.NewStdWriter(stdcopystream, stdcopy.Stdout)
errStream := stdcopy.NewStdWriter(stdcopystream, stdcopy.Stderr)
go func() {
for {
outStream.Write([]byte("out\n"))
}
}()
for {
errStream.Write([]byte("err\n"))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment