podman/pkg/channel/writer.go
Giuseppe Scrivano 4fe9dc2fbc
channel: simplify implementation
do not use recover() to prevent writing to a closed channel.  There is
already a lock, use it as well for Close and let Write check if the
channel is still active.

[NO TESTS NEEDED] it is a refactoring

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
2021-05-06 11:51:15 +02:00

63 lines
1.1 KiB
Go

package channel
import (
"io"
"sync"
"github.com/pkg/errors"
)
// WriteCloser is an io.WriteCloser that that proxies Write() calls to a channel
// The []byte buffer of the Write() is queued on the channel as one message.
type WriteCloser interface {
io.WriteCloser
Chan() <-chan []byte
}
type writeCloser struct {
ch chan []byte
mux sync.Mutex
}
// NewWriter initializes a new channel writer
func NewWriter(c chan []byte) WriteCloser {
return &writeCloser{
ch: c,
}
}
// Chan returns the R/O channel behind WriteCloser
func (w *writeCloser) Chan() <-chan []byte {
return w.ch
}
// Write method for WriteCloser
func (w *writeCloser) Write(b []byte) (bLen int, err error) {
if w == nil {
return 0, errors.New("use channel.NewWriter() to initialize a WriteCloser")
}
w.mux.Lock()
defer w.mux.Unlock()
if w.ch == nil {
return 0, errors.New("the channel is closed for Write")
}
buf := make([]byte, len(b))
copy(buf, b)
w.ch <- buf
return len(b), nil
}
// Close method for WriteCloser
func (w *writeCloser) Close() error {
w.mux.Lock()
defer w.mux.Unlock()
close(w.ch)
w.ch = nil
return nil
}