@@ -120,41 +120,48 @@ type slidingWindow struct {
120
120
121
121
var swPool = map [int ]* sync.Pool {}
122
122
123
- func newSlidingWindow (n int ) * slidingWindow {
123
+ func (sw * slidingWindow ) init (n int ) {
124
+ if sw .buf != nil {
125
+ return
126
+ }
127
+
124
128
p , ok := swPool [n ]
125
129
if ! ok {
126
130
p = & sync.Pool {}
127
131
swPool [n ] = p
128
132
}
129
- sw , ok := p .Get ().(* slidingWindow )
133
+ buf , ok := p .Get ().([] byte )
130
134
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 )
135
138
}
136
139
}
137
140
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 )
147
+ sw .buf = nil
141
148
}
142
149
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 )
150
+ func (sw * slidingWindow ) write (p []byte ) {
151
+ if len (p ) >= cap (sw .buf ) {
152
+ sw .buf = sw .buf [:cap (sw .buf )]
153
+ p = p [len (p )- cap (sw .buf ):]
154
+ copy (sw .buf , p )
148
155
return
149
156
}
150
157
151
- left := cap (w .buf ) - len (w .buf )
158
+ left := cap (sw .buf ) - len (sw .buf )
152
159
if left < len (p ) {
153
160
// We need to shift spaceNeeded bytes from the end to make room for p at the end.
154
161
spaceNeeded := len (p ) - left
155
- copy (w .buf , w .buf [spaceNeeded :])
156
- w .buf = w .buf [:len (w .buf )- spaceNeeded ]
162
+ copy (sw .buf , sw .buf [spaceNeeded :])
163
+ sw .buf = sw .buf [:len (sw .buf )- spaceNeeded ]
157
164
}
158
165
159
- w .buf = append (w .buf , p ... )
166
+ sw .buf = append (sw .buf , p ... )
160
167
}
0 commit comments