@@ -120,41 +120,47 @@ 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 )
141
147
}
142
148
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 )
148
154
return
149
155
}
150
156
151
- left := cap (w .buf )- len (w .buf )
157
+ left := cap (sw .buf )- len (sw .buf )
152
158
if left < len (p ) {
153
159
// We need to shift spaceNeeded bytes from the end to make room for p at the end.
154
160
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 ]
157
163
}
158
164
159
- w .buf = append (w .buf ,p ... )
165
+ sw .buf = append (sw .buf ,p ... )
160
166
}