@@ -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
261256func (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
276271func (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