@@ -120,41 +120,47 @@ type slidingWindow struct {
120120
121121var swPool = map [int ]* sync.Pool {}
122122
123- func newSlidingWindow (n int ) * slidingWindow {
123+ func (sw * slidingWindow ) init (n int ) {
124+ if sw .buf != nil {
125+ return
126+ }
127+
124128 p , ok := swPool [n ]
125129 if ! ok {
126130 p = & sync.Pool {}
127131 swPool [n ] = p
128132 }
129- sw , ok := p .Get ().(* slidingWindow )
133+ buf , ok := p .Get ().([] byte )
130134 if ok {
131- return sw
132- }
133- return & slidingWindow {
134- buf : make ([]byte , 0 , n ),
135+ sw .buf = buf [:0 ]
136+ } else {
137+ sw .buf = make ([]byte , 0 , n )
135138 }
136139}
137140
138- func returnSlidingWindow (sw * slidingWindow ) {
139- sw .buf = sw .buf [:0 ]
140- swPool [cap (sw .buf )].Put (sw )
141+ func (sw * slidingWindow ) close () {
142+ if sw .buf == nil {
143+ return
144+ }
145+
146+ swPool [cap (sw .buf )].Put (sw .buf )
141147}
142148
143- func (w * slidingWindow ) write (p []byte ) {
144- if len (p ) >= cap (w .buf ) {
145- w .buf = w .buf [:cap (w .buf )]
146- p = p [len (p )- cap (w .buf ):]
147- copy (w .buf , p )
149+ func (sw * slidingWindow ) write (p []byte ) {
150+ if len (p ) >= cap (sw .buf ) {
151+ sw .buf = sw .buf [:cap (sw .buf )]
152+ p = p [len (p )- cap (sw .buf ):]
153+ copy (sw .buf , p )
148154 return
149155 }
150156
151- left := cap (w .buf ) - len (w .buf )
157+ left := cap (sw .buf ) - len (sw .buf )
152158 if left < len (p ) {
153159 // We need to shift spaceNeeded bytes from the end to make room for p at the end.
154160 spaceNeeded := len (p ) - left
155- copy (w .buf , w .buf [spaceNeeded :])
156- w .buf = w .buf [:len (w .buf )- spaceNeeded ]
161+ copy (sw .buf , sw .buf [spaceNeeded :])
162+ sw .buf = sw .buf [:len (sw .buf )- spaceNeeded ]
157163 }
158164
159- w .buf = append (w .buf , p ... )
165+ sw .buf = append (sw .buf , p ... )
160166}
0 commit comments