Macaron 1.5 (#12596)
* update macaron to v1.5 of fork * update macaron to v1.5 of fork * test gzip PR * add push method impl to context_tests * use proper gzip commit Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
211321fb93
commit
c5d5d63c9c
53 changed files with 2622 additions and 665 deletions
90
vendor/github.com/klauspost/compress/zstd/encoder.go
generated
vendored
90
vendor/github.com/klauspost/compress/zstd/encoder.go
generated
vendored
|
@ -35,21 +35,22 @@ type encoder interface {
|
|||
AppendCRC([]byte) []byte
|
||||
WindowSize(size int) int32
|
||||
UseBlock(*blockEnc)
|
||||
Reset()
|
||||
Reset(singleBlock bool)
|
||||
}
|
||||
|
||||
type encoderState struct {
|
||||
w io.Writer
|
||||
filling []byte
|
||||
current []byte
|
||||
previous []byte
|
||||
encoder encoder
|
||||
writing *blockEnc
|
||||
err error
|
||||
writeErr error
|
||||
nWritten int64
|
||||
headerWritten bool
|
||||
eofWritten bool
|
||||
w io.Writer
|
||||
filling []byte
|
||||
current []byte
|
||||
previous []byte
|
||||
encoder encoder
|
||||
writing *blockEnc
|
||||
err error
|
||||
writeErr error
|
||||
nWritten int64
|
||||
headerWritten bool
|
||||
eofWritten bool
|
||||
fullFrameWritten bool
|
||||
|
||||
// This waitgroup indicates an encode is running.
|
||||
wg sync.WaitGroup
|
||||
|
@ -71,27 +72,26 @@ func NewWriter(w io.Writer, opts ...EOption) (*Encoder, error) {
|
|||
}
|
||||
if w != nil {
|
||||
e.Reset(w)
|
||||
} else {
|
||||
e.init.Do(func() {
|
||||
e.initialize()
|
||||
})
|
||||
}
|
||||
return &e, nil
|
||||
}
|
||||
|
||||
func (e *Encoder) initialize() {
|
||||
if e.o.concurrent == 0 {
|
||||
e.o.setDefault()
|
||||
}
|
||||
e.encoders = make(chan encoder, e.o.concurrent)
|
||||
for i := 0; i < e.o.concurrent; i++ {
|
||||
e.encoders <- e.o.encoder()
|
||||
enc := e.o.encoder()
|
||||
// If not single block, history will be allocated on first use.
|
||||
enc.Reset(true)
|
||||
e.encoders <- enc
|
||||
}
|
||||
}
|
||||
|
||||
// Reset will re-initialize the writer and new writes will encode to the supplied writer
|
||||
// as a new, independent stream.
|
||||
func (e *Encoder) Reset(w io.Writer) {
|
||||
e.init.Do(func() {
|
||||
e.initialize()
|
||||
})
|
||||
s := &e.state
|
||||
s.wg.Wait()
|
||||
s.wWg.Wait()
|
||||
|
@ -115,9 +115,10 @@ func (e *Encoder) Reset(w io.Writer) {
|
|||
s.filling = s.filling[:0]
|
||||
s.current = s.current[:0]
|
||||
s.previous = s.previous[:0]
|
||||
s.encoder.Reset()
|
||||
s.encoder.Reset(false)
|
||||
s.headerWritten = false
|
||||
s.eofWritten = false
|
||||
s.fullFrameWritten = false
|
||||
s.w = w
|
||||
s.err = nil
|
||||
s.nWritten = 0
|
||||
|
@ -176,6 +177,23 @@ func (e *Encoder) nextBlock(final bool) error {
|
|||
return fmt.Errorf("block > maxStoreBlockSize")
|
||||
}
|
||||
if !s.headerWritten {
|
||||
// If we have a single block encode, do a sync compression.
|
||||
if final && len(s.filling) > 0 {
|
||||
s.current = e.EncodeAll(s.filling, s.current[:0])
|
||||
var n2 int
|
||||
n2, s.err = s.w.Write(s.current)
|
||||
if s.err != nil {
|
||||
return s.err
|
||||
}
|
||||
s.nWritten += int64(n2)
|
||||
s.current = s.current[:0]
|
||||
s.filling = s.filling[:0]
|
||||
s.headerWritten = true
|
||||
s.fullFrameWritten = true
|
||||
s.eofWritten = true
|
||||
return nil
|
||||
}
|
||||
|
||||
var tmp [maxHeaderSize]byte
|
||||
fh := frameHeader{
|
||||
ContentSize: 0,
|
||||
|
@ -263,7 +281,7 @@ func (e *Encoder) nextBlock(final bool) error {
|
|||
// If we got the exact same number of literals as input,
|
||||
// assume the literals cannot be compressed.
|
||||
if len(src) != len(blk.literals) || len(src) != e.o.blockSize {
|
||||
err = blk.encode(e.o.noEntropy)
|
||||
err = blk.encode(e.o.noEntropy, !e.o.allLitEntropy)
|
||||
}
|
||||
switch err {
|
||||
case errIncompressible:
|
||||
|
@ -298,7 +316,9 @@ func (e *Encoder) ReadFrom(r io.Reader) (n int64, err error) {
|
|||
src := e.state.filling
|
||||
for {
|
||||
n2, err := r.Read(src)
|
||||
_, _ = e.state.encoder.CRC().Write(src[:n2])
|
||||
if e.o.crc {
|
||||
_, _ = e.state.encoder.CRC().Write(src[:n2])
|
||||
}
|
||||
// src is now the unfilled part...
|
||||
src = src[n2:]
|
||||
n += int64(n2)
|
||||
|
@ -363,6 +383,9 @@ func (e *Encoder) Close() error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if e.state.fullFrameWritten {
|
||||
return s.err
|
||||
}
|
||||
s.wg.Wait()
|
||||
s.wWg.Wait()
|
||||
|
||||
|
@ -422,18 +445,14 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte {
|
|||
}
|
||||
return dst
|
||||
}
|
||||
e.init.Do(func() {
|
||||
e.o.setDefault()
|
||||
e.initialize()
|
||||
})
|
||||
e.init.Do(e.initialize)
|
||||
enc := <-e.encoders
|
||||
defer func() {
|
||||
// Release encoder reference to last block.
|
||||
enc.Reset()
|
||||
// If a non-single block is needed the encoder will reset again.
|
||||
enc.Reset(true)
|
||||
e.encoders <- enc
|
||||
}()
|
||||
enc.Reset()
|
||||
blk := enc.Block()
|
||||
// Use single segments when above minimum window and below 1MB.
|
||||
single := len(src) < 1<<20 && len(src) > MinWindowSize
|
||||
if e.o.single != nil {
|
||||
|
@ -456,12 +475,13 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
if len(src) <= e.o.blockSize && len(src) <= maxBlockSize {
|
||||
// If we can do everything in one block, prefer that.
|
||||
if len(src) <= maxCompressedBlockSize {
|
||||
// Slightly faster with no history and everything in one block.
|
||||
if e.o.crc {
|
||||
_, _ = enc.CRC().Write(src)
|
||||
}
|
||||
blk.reset(nil)
|
||||
blk := enc.Block()
|
||||
blk.last = true
|
||||
enc.EncodeNoHist(blk, src)
|
||||
|
||||
|
@ -472,7 +492,7 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte {
|
|||
if len(blk.literals) != len(src) || len(src) != e.o.blockSize {
|
||||
// Output directly to dst
|
||||
blk.output = dst
|
||||
err = blk.encode(e.o.noEntropy)
|
||||
err = blk.encode(e.o.noEntropy, !e.o.allLitEntropy)
|
||||
}
|
||||
|
||||
switch err {
|
||||
|
@ -488,6 +508,8 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte {
|
|||
}
|
||||
blk.output = oldout
|
||||
} else {
|
||||
enc.Reset(false)
|
||||
blk := enc.Block()
|
||||
for len(src) > 0 {
|
||||
todo := src
|
||||
if len(todo) > e.o.blockSize {
|
||||
|
@ -507,7 +529,7 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte {
|
|||
// If we got the exact same number of literals as input,
|
||||
// assume the literals cannot be compressed.
|
||||
if len(blk.literals) != len(todo) || len(todo) != e.o.blockSize {
|
||||
err = blk.encode(e.o.noEntropy)
|
||||
err = blk.encode(e.o.noEntropy, !e.o.allLitEntropy)
|
||||
}
|
||||
|
||||
switch err {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue