@@ -45,21 +45,21 @@ type Conn struct {
45
45
// writeFrameLock is acquired to write a single frame.
46
46
// Effectively meaning whoever holds it gets to write to bw.
47
47
writeFrameLock chan struct {}
48
+ writeHeaderBuf []byte
48
49
49
50
// Used to ensure the previous reader is read till EOF before allowing
50
51
// a new one.
51
52
previousReader * messageReader
52
53
// readFrameLock is acquired to read from bw.
53
- readFrameLock chan struct {}
54
+ readFrameLock chan struct {}
55
+ readHeaderBuf []byte
56
+ controlPayloadBuf []byte
54
57
55
58
setReadTimeout chan context.Context
56
59
setWriteTimeout chan context.Context
57
60
58
61
activePingsMu sync.Mutex
59
62
activePings map [string ]chan <- struct {}
60
-
61
- headerBuf []byte
62
- controlPayloadBuf []byte
63
63
}
64
64
65
65
func (c * Conn ) init () {
@@ -77,7 +77,8 @@ func (c *Conn) init() {
77
77
78
78
c .activePings = make (map [string ]chan <- struct {})
79
79
80
- c .headerBuf = makeHeaderBuf ()
80
+ c .writeHeaderBuf = makeWriteHeaderBuf ()
81
+ c .readHeaderBuf = makeReadHeaderBuf ()
81
82
c .controlPayloadBuf = make ([]byte , maxControlFramePayload )
82
83
83
84
runtime .SetFinalizer (c , func (c * Conn ) {
@@ -215,7 +216,7 @@ func (c *Conn) readFrameHeader(ctx context.Context) (header, error) {
215
216
case c .setReadTimeout <- ctx :
216
217
}
217
218
218
- h , err := readHeader (c .headerBuf , c .br )
219
+ h , err := readHeader (c .readHeaderBuf , c .br )
219
220
if err != nil {
220
221
select {
221
222
case <- c .closed :
@@ -628,7 +629,7 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, opcode opcode, p []byte
628
629
}
629
630
}
630
631
631
- b2 := marshalHeader ( h )
632
+ headerBytes := writeHeader ( c . writeHeaderBuf , h )
632
633
633
634
err := c .acquireLock (ctx , c .writeFrameLock )
634
635
if err != nil {
@@ -651,7 +652,7 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, opcode opcode, p []byte
651
652
default :
652
653
}
653
654
654
- err = xerrors .Errorf ("failed to write frame: %w" , err )
655
+ err = xerrors .Errorf ("failed to write %v frame: %w" , h . opcode , err )
655
656
// We need to release the lock first before closing the connection to ensure
656
657
// the lock can be acquired inside close to ensure no one can access c.bw.
657
658
c .releaseLock (c .writeFrameLock )
@@ -660,7 +661,7 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, opcode opcode, p []byte
660
661
return err
661
662
}
662
663
663
- _ , err = c .bw .Write (b2 )
664
+ _ , err = c .bw .Write (headerBytes )
664
665
if err != nil {
665
666
return 0 , writeErr (err )
666
667
}
0 commit comments