simple_go124.go raw
1 // Copyright 2025+ Klaus Post. All rights reserved.
2 // License information can be found in the LICENSE file.
3
4 //go:build go1.24
5
6 package zstd
7
8 import (
9 "errors"
10 "runtime"
11 "sync"
12 "weak"
13 )
14
15 var weakMu sync.Mutex
16 var simpleEnc weak.Pointer[Encoder]
17 var simpleDec weak.Pointer[Decoder]
18
19 // EncodeTo appends the encoded data from src to dst.
20 func EncodeTo(dst []byte, src []byte) []byte {
21 weakMu.Lock()
22 enc := simpleEnc.Value()
23 if enc == nil {
24 var err error
25 enc, err = NewWriter(nil, WithEncoderConcurrency(runtime.NumCPU()), WithWindowSize(1<<20), WithLowerEncoderMem(true), WithZeroFrames(true))
26 if err != nil {
27 panic("failed to create simple encoder: " + err.Error())
28 }
29 simpleEnc = weak.Make(enc)
30 }
31 weakMu.Unlock()
32
33 return enc.EncodeAll(src, dst)
34 }
35
36 // DecodeTo appends the decoded data from src to dst.
37 // The maximum decoded size is 1GiB,
38 // not including what may already be in dst.
39 func DecodeTo(dst []byte, src []byte) ([]byte, error) {
40 weakMu.Lock()
41 dec := simpleDec.Value()
42 if dec == nil {
43 var err error
44 dec, err = NewReader(nil, WithDecoderConcurrency(runtime.NumCPU()), WithDecoderLowmem(true), WithDecoderMaxMemory(1<<30))
45 if err != nil {
46 weakMu.Unlock()
47 return nil, errors.New("failed to create simple decoder: " + err.Error())
48 }
49 runtime.SetFinalizer(dec, func(d *Decoder) {
50 d.Close()
51 })
52 simpleDec = weak.Make(dec)
53 }
54 weakMu.Unlock()
55 return dec.DecodeAll(src, dst)
56 }
57