@@ -6,6 +6,7 @@ package zstd
6
6
7
7
import (
8
8
"crypto/rand"
9
+ "errors"
9
10
"fmt"
10
11
"io"
11
12
"math"
@@ -149,6 +150,9 @@ func (e *Encoder) ResetContentSize(w io.Writer, size int64) {
149
150
// and write CRC if requested.
150
151
func (e * Encoder ) Write (p []byte ) (n int , err error ) {
151
152
s := & e .state
153
+ if s .eofWritten {
154
+ return 0 , ErrEncoderClosed
155
+ }
152
156
for len (p ) > 0 {
153
157
if len (p )+ len (s .filling ) < e .o .blockSize {
154
158
if e .o .crc {
@@ -288,6 +292,9 @@ func (e *Encoder) nextBlock(final bool) error {
288
292
s .filling , s .current , s .previous = s .previous [:0 ], s .filling , s .current
289
293
s .nInput += int64 (len (s .current ))
290
294
s .wg .Add (1 )
295
+ if final {
296
+ s .eofWritten = true
297
+ }
291
298
go func (src []byte ) {
292
299
if debugEncoder {
293
300
println ("Adding block," , len (src ), "bytes, final:" , final )
@@ -303,9 +310,6 @@ func (e *Encoder) nextBlock(final bool) error {
303
310
blk := enc .Block ()
304
311
enc .Encode (blk , src )
305
312
blk .last = final
306
- if final {
307
- s .eofWritten = true
308
- }
309
313
// Wait for pending writes.
310
314
s .wWg .Wait ()
311
315
if s .writeErr != nil {
@@ -401,12 +405,20 @@ func (e *Encoder) Flush() error {
401
405
if len (s .filling ) > 0 {
402
406
err := e .nextBlock (false )
403
407
if err != nil {
408
+ // Ignore Flush after Close.
409
+ if errors .Is (s .err , ErrEncoderClosed ) {
410
+ return nil
411
+ }
404
412
return err
405
413
}
406
414
}
407
415
s .wg .Wait ()
408
416
s .wWg .Wait ()
409
417
if s .err != nil {
418
+ // Ignore Flush after Close.
419
+ if errors .Is (s .err , ErrEncoderClosed ) {
420
+ return nil
421
+ }
410
422
return s .err
411
423
}
412
424
return s .writeErr
@@ -422,6 +434,9 @@ func (e *Encoder) Close() error {
422
434
}
423
435
err := e .nextBlock (true )
424
436
if err != nil {
437
+ if errors .Is (s .err , ErrEncoderClosed ) {
438
+ return nil
439
+ }
425
440
return err
426
441
}
427
442
if s .frameContentSize > 0 {
@@ -459,6 +474,11 @@ func (e *Encoder) Close() error {
459
474
}
460
475
_ , s .err = s .w .Write (frame )
461
476
}
477
+ if s .err == nil {
478
+ s .err = ErrEncoderClosed
479
+ return nil
480
+ }
481
+
462
482
return s .err
463
483
}
464
484
0 commit comments