Skip to content

Commit c326b67

Browse files
authored
Merge branch 'master' into timeout-background-fast-path
2 parents 4b60f30 + 7039364 commit c326b67

1 file changed

Lines changed: 26 additions & 31 deletions

File tree

read.go

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -217,53 +217,48 @@ func (c *Conn) readLoop(ctx context.Context) (header, error) {
217217
}
218218
}
219219

220-
// prepareRead sets the readTimeout context and returns a done function
221-
// to be called after the read is done. It also returns an error if the
222-
// connection is closed. The reference to the error is used to assign
223-
// an error depending on if the connection closed or the context timed
224-
// out during use. Typically, the referenced error is a named return
225-
// variable of the function calling this method.
226-
func (c *Conn) prepareRead(ctx context.Context, err *error) (func(), error) {
220+
// prepareRead sets the read timeout and checks whether the connection is closed.
221+
func (c *Conn) prepareRead(ctx context.Context) error {
227222
select {
228223
case <-c.closed:
229-
return nil, net.ErrClosed
224+
return net.ErrClosed
230225
default:
231226
}
232227
timeoutSet := c.setupReadTimeout(ctx)
233228

234-
done := func() {
235-
if timeoutSet {
236-
c.clearReadTimeout()
237-
}
238-
select {
239-
case <-c.closed:
240-
if *err != nil {
241-
*err = net.ErrClosed
242-
}
243-
default:
244-
}
245-
if *err != nil && ctx.Err() != nil {
246-
*err = ctx.Err()
247-
}
248-
}
249-
250229
c.closeStateMu.Lock()
251230
closeReceivedErr := c.closeReceivedErr
252231
c.closeStateMu.Unlock()
253232
if closeReceivedErr != nil {
254-
defer done()
255-
return nil, closeReceivedErr
233+
c.clearReadTimeout()
234+
return closeReceivedErr
256235
}
257236

258-
return done, nil
237+
return nil
238+
}
239+
240+
// finishRead clears the read timeout and reports whether the connection or
241+
// operation context ended while the read was in progress.
242+
func (c *Conn) finishRead(ctx context.Context, err *error) {
243+
c.clearReadTimeout()
244+
select {
245+
case <-c.closed:
246+
if *err != nil {
247+
*err = net.ErrClosed
248+
}
249+
default:
250+
}
251+
if *err != nil && ctx.Err() != nil {
252+
*err = ctx.Err()
253+
}
259254
}
260255

261256
func (c *Conn) readFrameHeader(ctx context.Context) (_ header, err error) {
262-
readDone, err := c.prepareRead(ctx, &err)
257+
err = c.prepareRead(ctx)
263258
if err != nil {
264259
return header{}, err
265260
}
266-
defer readDone()
261+
defer c.finishRead(ctx, &err)
267262

268263
h, err := readFrameHeader(c.br, c.readHeaderBuf[:])
269264
if err != nil {
@@ -274,11 +269,11 @@ func (c *Conn) readFrameHeader(ctx context.Context) (_ header, err error) {
274269
}
275270

276271
func (c *Conn) readFramePayload(ctx context.Context, p []byte) (_ int, err error) {
277-
readDone, err := c.prepareRead(ctx, &err)
272+
err = c.prepareRead(ctx)
278273
if err != nil {
279274
return 0, err
280275
}
281-
defer readDone()
276+
defer c.finishRead(ctx, &err)
282277

283278
n, err := io.ReadFull(c.br, p)
284279
if err != nil {

0 commit comments

Comments
 (0)