github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2015/tricks/broadcastwriter/broadcastwriter.go (about)

     1  package broadcastwriter
     2  
     3  import (
     4  	"io"
     5  	"sync"
     6  )
     7  
     8  type BroadcastWriter struct {
     9  	sync.Mutex
    10  	writers map[io.WriteCloser]struct{}
    11  }
    12  
    13  func (w *BroadcastWriter) AddWriter(writer io.WriteCloser) {
    14  	w.Lock()
    15  	w.writers[writer] = struct{}{}
    16  	w.Unlock()
    17  }
    18  
    19  func (w *BroadcastWriter) Write(p []byte) (n int, err error) {
    20  	w.Lock()
    21  	for sw := range w.writers {
    22  		if n, err := sw.Write(p); err != nil || n != len(p) {
    23  			delete(w.writers, sw)
    24  		}
    25  	}
    26  	w.Unlock()
    27  	return len(p), nil
    28  }
    29  
    30  // END OMIT
    31  
    32  func (w *BroadcastWriter) Clean() error {
    33  	w.Lock()
    34  	for w := range w.writers {
    35  		w.Close()
    36  	}
    37  	w.writers = make(map[io.WriteCloser]struct{})
    38  	w.Unlock()
    39  	return nil
    40  }
    41  
    42  func New() *BroadcastWriter {
    43  	return &BroadcastWriter{
    44  		writers: make(map[io.WriteCloser]struct{}),
    45  	}
    46  }