Files
weave-scope/vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go
Marc Carré a74f203668 Update fsouza/go-dockerclient to v1.2.0
```
gvt delete github.com/fsouza/go-dockerclient
gvt delete github.com/docker/docker/opts
gvt delete github.com/docker/docker/pkg/archive
gvt delete github.com/docker/docker/pkg/fileutils
gvt delete github.com/docker/docker/pkg/homedir
gvt delete github.com/docker/docker/pkg/idtools
gvt delete github.com/docker/docker/pkg/ioutils
gvt delete github.com/docker/docker/pkg/longpath
gvt delete github.com/docker/docker/pkg/mflag
gvt delete github.com/docker/docker/pkg/mount
gvt delete github.com/docker/docker/pkg/parsers
gvt delete github.com/docker/docker/pkg/pools
gvt delete github.com/docker/docker/pkg/promise
gvt delete github.com/docker/docker/pkg/stdcopy
gvt delete github.com/docker/docker/pkg/system
gvt delete github.com/docker/docker/pkg/term
gvt delete github.com/docker/docker/pkg/units
gvt delete github.com/docker/libcontainer/cgroups
gvt delete github.com/docker/distribution/digest
gvt delete github.com/docker/distribution/reference
gvt delete github.com/docker/distribution/vendor/github.com/stevvooe/resumable
gvt fetch --tag 1.2.0 github.com/fsouza/go-dockerclient
2018/07/23 17:03:36 Fetching: github.com/fsouza/go-dockerclient
2018/07/23 17:03:39 · Skipping (existing): github.com/docker/go-units
2018/07/23 17:03:39 · Fetching recursive dependency: github.com/docker/docker/pkg/jsonmessage
2018/07/23 17:03:51 ·· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/Nvveen/Gotty
2018/07/23 17:03:51 ·· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/docker/go-units
2018/07/23 17:03:51 ·· Fetching recursive dependency: github.com/docker/docker/pkg/term
2018/07/23 17:03:51 ··· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/Azure/go-ansiterm
2018/07/23 17:03:51 ··· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/sirupsen/logrus
2018/07/23 17:03:51 ···· Fetching recursive dependency: github.com/docker/docker/vendor/golang.org/x/sys/unix
2018/07/23 17:03:51 ···· Fetching recursive dependency: github.com/docker/docker/vendor/golang.org/x/crypto/ssh/terminal
2018/07/23 17:03:51 ····· Fetching recursive dependency: github.com/docker/docker/vendor/golang.org/x/sys/windows
2018/07/23 17:03:51 · Skipping (existing): github.com/gorilla/mux
2018/07/23 17:03:51 · Fetching recursive dependency: github.com/docker/docker/api/types/swarm
2018/07/23 17:03:51 ·· Fetching recursive dependency: github.com/docker/docker/api/types/network
2018/07/23 17:03:51 ··· Fetching recursive dependency: github.com/docker/docker/api/types/filters
2018/07/23 17:03:51 ···· Fetching recursive dependency: github.com/docker/docker/api/types/versions
2018/07/23 17:03:51 ····· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/docker/go-connections/nat
2018/07/23 17:03:51 ····· Fetching recursive dependency: github.com/docker/docker/api/types
2018/07/23 17:03:51 ······ Fetching recursive dependency: github.com/docker/docker/errdefs
2018/07/23 17:03:51 ······ Fetching recursive dependency: github.com/docker/docker/pkg/streamformatter
2018/07/23 17:03:51 ······· Fetching recursive dependency: github.com/docker/docker/pkg/progress
2018/07/23 17:03:51 ········ Fetching recursive dependency: github.com/docker/docker/vendor/golang.org/x/time/rate
2018/07/23 17:03:51 ········· Fetching recursive dependency: github.com/docker/docker/vendor/golang.org/x/net/context
2018/07/23 17:03:52 ······ Fetching recursive dependency: github.com/docker/docker/vendor/github.com/gogo/protobuf/proto
2018/07/23 17:03:52 ······ Fetching recursive dependency: github.com/docker/docker/vendor/github.com/opencontainers/image-spec/specs-go/v1
2018/07/23 17:03:52 ······· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/opencontainers/go-digest
2018/07/23 17:03:52 ······· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/opencontainers/image-spec/specs-go
2018/07/23 17:03:52 · Fetching recursive dependency: github.com/docker/docker/pkg/homedir
2018/07/23 17:03:52 ·· Fetching recursive dependency: github.com/docker/docker/pkg/idtools
2018/07/23 17:03:52 ··· Fetching recursive dependency: github.com/docker/docker/pkg/system
2018/07/23 17:03:52 ···· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/pkg/errors
2018/07/23 17:03:52 ···· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/Microsoft/go-winio
2018/07/23 17:03:52 ···· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/containerd/continuity/pathdriver
2018/07/23 17:03:52 ···· Fetching recursive dependency: github.com/docker/docker/pkg/mount
2018/07/23 17:03:52 ··· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/opencontainers/runc/libcontainer/user
2018/07/23 17:03:52 · Fetching recursive dependency: github.com/docker/docker/pkg/stdcopy
2018/07/23 17:03:52 · Fetching recursive dependency: github.com/docker/docker/pkg/archive
2018/07/23 17:03:52 ·· Fetching recursive dependency: github.com/docker/docker/pkg/pools
2018/07/23 17:03:52 ··· Fetching recursive dependency: github.com/docker/docker/pkg/ioutils
2018/07/23 17:03:52 ···· Fetching recursive dependency: github.com/docker/docker/pkg/longpath
2018/07/23 17:03:52 ·· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/opencontainers/runc/libcontainer/system
2018/07/23 17:03:52 ·· Fetching recursive dependency: github.com/docker/docker/pkg/fileutils
2018/07/23 17:03:52 ·· Fetching recursive dependency: github.com/docker/docker/vendor/archive/tar
2018/07/23 17:03:52 · Skipping (existing): golang.org/x/net/context
2018/07/23 17:03:52 · Fetching recursive dependency: github.com/docker/docker/opts
2018/07/23 17:03:53 ·· Fetching recursive dependency: github.com/docker/docker/vendor/github.com/docker/libnetwork/ipamutils
2018/07/23 17:03:53 · Skipping (existing): golang.org/x/net/context/ctxhttp
2018/07/23 17:03:53 · Fetching recursive dependency: github.com/Microsoft/go-winio
2018/07/23 17:03:55 ·· Fetching recursive dependency: golang.org/x/sys/windows
```
2018-07-23 20:10:16 +02:00

93 lines
2.0 KiB
Go

package ioutils // import "github.com/docker/docker/pkg/ioutils"
import (
"io"
"sync"
)
// WriteFlusher wraps the Write and Flush operation ensuring that every write
// is a flush. In addition, the Close method can be called to intercept
// Read/Write calls if the targets lifecycle has already ended.
type WriteFlusher struct {
w io.Writer
flusher flusher
flushed chan struct{}
flushedOnce sync.Once
closed chan struct{}
closeLock sync.Mutex
}
type flusher interface {
Flush()
}
var errWriteFlusherClosed = io.EOF
func (wf *WriteFlusher) Write(b []byte) (n int, err error) {
select {
case <-wf.closed:
return 0, errWriteFlusherClosed
default:
}
n, err = wf.w.Write(b)
wf.Flush() // every write is a flush.
return n, err
}
// Flush the stream immediately.
func (wf *WriteFlusher) Flush() {
select {
case <-wf.closed:
return
default:
}
wf.flushedOnce.Do(func() {
close(wf.flushed)
})
wf.flusher.Flush()
}
// Flushed returns the state of flushed.
// If it's flushed, return true, or else it return false.
func (wf *WriteFlusher) Flushed() bool {
// BUG(stevvooe): Remove this method. Its use is inherently racy. Seems to
// be used to detect whether or a response code has been issued or not.
// Another hook should be used instead.
var flushed bool
select {
case <-wf.flushed:
flushed = true
default:
}
return flushed
}
// Close closes the write flusher, disallowing any further writes to the
// target. After the flusher is closed, all calls to write or flush will
// result in an error.
func (wf *WriteFlusher) Close() error {
wf.closeLock.Lock()
defer wf.closeLock.Unlock()
select {
case <-wf.closed:
return errWriteFlusherClosed
default:
close(wf.closed)
}
return nil
}
// NewWriteFlusher returns a new WriteFlusher.
func NewWriteFlusher(w io.Writer) *WriteFlusher {
var fl flusher
if f, ok := w.(flusher); ok {
fl = f
} else {
fl = &NopFlusher{}
}
return &WriteFlusher{w: w, flusher: fl, closed: make(chan struct{}), flushed: make(chan struct{})}
}