simple_go124.go 1.4 KB

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