@@ -83,11 +83,14 @@ type Writer struct {
83
83
snappy bool
84
84
flushOnWrite bool
85
85
appendIndex bool
86
+ bufferCB func ([]byte )
86
87
level uint8
87
88
}
88
89
89
90
type result struct {
90
91
b []byte
92
+ // return when writing
93
+ ret []byte
91
94
// Uncompressed start offset
92
95
startOffset int64
93
96
}
@@ -146,6 +149,10 @@ func (w *Writer) Reset(writer io.Writer) {
146
149
for write := range toWrite {
147
150
// Wait for the data to be available.
148
151
input := <- write
152
+ if input .ret != nil && w .bufferCB != nil {
153
+ w .bufferCB (input .ret )
154
+ input .ret = nil
155
+ }
149
156
in := input .b
150
157
if len (in ) > 0 {
151
158
if w .err (nil ) == nil {
@@ -341,7 +348,8 @@ func (w *Writer) AddSkippableBlock(id uint8, data []byte) (err error) {
341
348
// but the input buffer cannot be written to by the caller
342
349
// until Flush or Close has been called when concurrency != 1.
343
350
//
344
- // If you cannot control that, use the regular Write function.
351
+ // Use the WriterBufferDone to receive a callback when the buffer is done
352
+ // Processing.
345
353
//
346
354
// Note that input is not buffered.
347
355
// This means that each write will result in discrete blocks being created.
@@ -364,6 +372,9 @@ func (w *Writer) EncodeBuffer(buf []byte) (err error) {
364
372
}
365
373
if w .concurrency == 1 {
366
374
_ , err := w .writeSync (buf )
375
+ if w .bufferCB != nil {
376
+ w .bufferCB (buf )
377
+ }
367
378
return err
368
379
}
369
380
@@ -378,7 +389,7 @@ func (w *Writer) EncodeBuffer(buf []byte) (err error) {
378
389
hWriter <- result {startOffset : w .uncompWritten , b : magicChunkBytes }
379
390
}
380
391
}
381
-
392
+ orgBuf := buf
382
393
for len (buf ) > 0 {
383
394
// Cut input.
384
395
uncompressed := buf
@@ -397,6 +408,9 @@ func (w *Writer) EncodeBuffer(buf []byte) (err error) {
397
408
startOffset : w .uncompWritten ,
398
409
}
399
410
w .uncompWritten += int64 (len (uncompressed ))
411
+ if len (buf ) == 0 && w .bufferCB != nil {
412
+ res .ret = orgBuf
413
+ }
400
414
go func () {
401
415
race .ReadSlice (uncompressed )
402
416
@@ -941,6 +955,17 @@ func WriterUncompressed() WriterOption {
941
955
}
942
956
}
943
957
958
+ // WriterBufferDone will perform a callback when EncodeBuffer has finished
959
+ // writing a buffer to the output and the buffer can safely be reused.
960
+ // If the buffer was split into several blocks, it will be sent after the last block.
961
+ // Callbacks will not be done concurrently.
962
+ func WriterBufferDone (fn func (b []byte )) WriterOption {
963
+ return func (w * Writer ) error {
964
+ w .bufferCB = fn
965
+ return nil
966
+ }
967
+ }
968
+
944
969
// WriterBlockSize allows to override the default block size.
945
970
// Blocks will be this size or smaller.
946
971
// Minimum size is 4KB and maximum size is 4MB.
0 commit comments