github.com/karrick/gorill@v1.10.3/lockedWriteCloser.go (about) 1 package gorill 2 3 import ( 4 "io" 5 "sync" 6 ) 7 8 // LockingWriteCloser is an io.WriteCloser that allows only exclusive access to its Write and Close 9 // method. 10 type LockingWriteCloser struct { 11 lock sync.Mutex 12 iowc io.WriteCloser 13 } 14 15 // NewLockingWriteCloser returns a LockingWriteCloser, that allows only exclusive access to its 16 // Write and Close method. 17 // 18 // lwc := gorill.NewLockingWriteCloser(os.Stdout) 19 // for i := 0; i < 1000; i++ { 20 // go func(iow io.Writer, i int) { 21 // for j := 0; j < 100; j++ { 22 // _, err := iow.Write([]byte("Hello, World, from %d!\n", i)) 23 // if err != nil { 24 // return 25 // } 26 // } 27 // }(lwc, i) 28 // } 29 func NewLockingWriteCloser(iowc io.WriteCloser) *LockingWriteCloser { 30 return &LockingWriteCloser{iowc: iowc} 31 } 32 33 // Write writes data to the underlying io.WriteCloser. 34 func (lwc *LockingWriteCloser) Write(data []byte) (int, error) { 35 lwc.lock.Lock() 36 defer lwc.lock.Unlock() 37 return lwc.iowc.Write(data) 38 } 39 40 // Close closes the underlying io.WriteCloser. 41 func (lwc *LockingWriteCloser) Close() error { 42 lwc.lock.Lock() 43 defer lwc.lock.Unlock() 44 return lwc.iowc.Close() 45 }