mirror of
https://github.com/moby/moby.git
synced 2026-01-11 18:51:37 +00:00
Merge pull request #51807 from mismithhisler/use-afterFunc-stop-func
client: use stop function to deregister context.AfterFunc
This commit is contained in:
@@ -45,12 +45,15 @@ func (r stream) Close() error {
|
|||||||
// JSONMessages decodes the response stream as a sequence of JSONMessages.
|
// JSONMessages decodes the response stream as a sequence of JSONMessages.
|
||||||
// if stream ends or context is cancelled, the underlying [io.Reader] is closed.
|
// if stream ends or context is cancelled, the underlying [io.Reader] is closed.
|
||||||
func (r stream) JSONMessages(ctx context.Context) iter.Seq2[jsonstream.Message, error] {
|
func (r stream) JSONMessages(ctx context.Context) iter.Seq2[jsonstream.Message, error] {
|
||||||
context.AfterFunc(ctx, func() {
|
stop := context.AfterFunc(ctx, func() {
|
||||||
_ = r.Close()
|
_ = r.Close()
|
||||||
})
|
})
|
||||||
dec := json.NewDecoder(r)
|
dec := json.NewDecoder(r)
|
||||||
return func(yield func(jsonstream.Message, error) bool) {
|
return func(yield func(jsonstream.Message, error) bool) {
|
||||||
defer r.Close()
|
defer func() {
|
||||||
|
stop() // unregister AfterFunc
|
||||||
|
r.Close()
|
||||||
|
}()
|
||||||
for {
|
for {
|
||||||
var jm jsonstream.Message
|
var jm jsonstream.Message
|
||||||
err := dec.Decode(&jm)
|
err := dec.Decode(&jm)
|
||||||
|
|||||||
@@ -136,14 +136,19 @@ func newCancelReadCloser(ctx context.Context, rc io.ReadCloser) io.ReadCloser {
|
|||||||
rc: rc,
|
rc: rc,
|
||||||
close: sync.OnceValue(rc.Close),
|
close: sync.OnceValue(rc.Close),
|
||||||
}
|
}
|
||||||
context.AfterFunc(ctx, func() { _ = crc.Close() })
|
crc.stop = context.AfterFunc(ctx, func() { _ = crc.Close() })
|
||||||
return crc
|
return crc
|
||||||
}
|
}
|
||||||
|
|
||||||
type cancelReadCloser struct {
|
type cancelReadCloser struct {
|
||||||
rc io.ReadCloser
|
rc io.ReadCloser
|
||||||
close func() error
|
close func() error
|
||||||
|
stop func() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cancelReadCloser) Read(p []byte) (int, error) { return c.rc.Read(p) }
|
func (c *cancelReadCloser) Read(p []byte) (int, error) { return c.rc.Read(p) }
|
||||||
func (c *cancelReadCloser) Close() error { return c.close() }
|
|
||||||
|
func (c *cancelReadCloser) Close() error {
|
||||||
|
c.stop() // unregister AfterFunc
|
||||||
|
return c.close()
|
||||||
|
}
|
||||||
|
|||||||
7
vendor/github.com/moby/moby/client/internal/jsonmessages.go
generated
vendored
7
vendor/github.com/moby/moby/client/internal/jsonmessages.go
generated
vendored
@@ -45,12 +45,15 @@ func (r stream) Close() error {
|
|||||||
// JSONMessages decodes the response stream as a sequence of JSONMessages.
|
// JSONMessages decodes the response stream as a sequence of JSONMessages.
|
||||||
// if stream ends or context is cancelled, the underlying [io.Reader] is closed.
|
// if stream ends or context is cancelled, the underlying [io.Reader] is closed.
|
||||||
func (r stream) JSONMessages(ctx context.Context) iter.Seq2[jsonstream.Message, error] {
|
func (r stream) JSONMessages(ctx context.Context) iter.Seq2[jsonstream.Message, error] {
|
||||||
context.AfterFunc(ctx, func() {
|
stop := context.AfterFunc(ctx, func() {
|
||||||
_ = r.Close()
|
_ = r.Close()
|
||||||
})
|
})
|
||||||
dec := json.NewDecoder(r)
|
dec := json.NewDecoder(r)
|
||||||
return func(yield func(jsonstream.Message, error) bool) {
|
return func(yield func(jsonstream.Message, error) bool) {
|
||||||
defer r.Close()
|
defer func() {
|
||||||
|
stop() // unregister AfterFunc
|
||||||
|
r.Close()
|
||||||
|
}()
|
||||||
for {
|
for {
|
||||||
var jm jsonstream.Message
|
var jm jsonstream.Message
|
||||||
err := dec.Decode(&jm)
|
err := dec.Decode(&jm)
|
||||||
|
|||||||
9
vendor/github.com/moby/moby/client/utils.go
generated
vendored
9
vendor/github.com/moby/moby/client/utils.go
generated
vendored
@@ -136,14 +136,19 @@ func newCancelReadCloser(ctx context.Context, rc io.ReadCloser) io.ReadCloser {
|
|||||||
rc: rc,
|
rc: rc,
|
||||||
close: sync.OnceValue(rc.Close),
|
close: sync.OnceValue(rc.Close),
|
||||||
}
|
}
|
||||||
context.AfterFunc(ctx, func() { _ = crc.Close() })
|
crc.stop = context.AfterFunc(ctx, func() { _ = crc.Close() })
|
||||||
return crc
|
return crc
|
||||||
}
|
}
|
||||||
|
|
||||||
type cancelReadCloser struct {
|
type cancelReadCloser struct {
|
||||||
rc io.ReadCloser
|
rc io.ReadCloser
|
||||||
close func() error
|
close func() error
|
||||||
|
stop func() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cancelReadCloser) Read(p []byte) (int, error) { return c.rc.Read(p) }
|
func (c *cancelReadCloser) Read(p []byte) (int, error) { return c.rc.Read(p) }
|
||||||
func (c *cancelReadCloser) Close() error { return c.close() }
|
|
||||||
|
func (c *cancelReadCloser) Close() error {
|
||||||
|
c.stop() // unregister AfterFunc
|
||||||
|
return c.close()
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user