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  }