Mining/pkg/mining/bufpool.go
Virgil 68c826a3d8
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
Align mining AX naming and comments
2026-04-04 05:33:08 +00:00

59 lines
1.4 KiB
Go

package mining
import (
"bytes"
"encoding/json"
"sync"
)
// buffer := jsonBufferPool.Get().(*bytes.Buffer)
// buffer.Reset()
// defer jsonBufferPool.Put(buffer)
var jsonBufferPool = sync.Pool{
New: func() any {
return bytes.NewBuffer(make([]byte, 0, 1024))
},
}
// buffer := acquireJSONBuffer()
// defer releaseJSONBuffer(buffer)
func acquireJSONBuffer() *bytes.Buffer {
buffer := jsonBufferPool.Get().(*bytes.Buffer)
buffer.Reset()
return buffer
}
// releaseJSONBuffer(buffer) returns the buffer to the pool when it stays under 64 KB.
func releaseJSONBuffer(buffer *bytes.Buffer) {
if buffer.Cap() <= 65536 {
jsonBufferPool.Put(buffer)
}
}
// UnmarshalJSON(data, &message)
func UnmarshalJSON(data []byte, target interface{}) error {
return json.Unmarshal(data, target)
}
// data, err := MarshalJSON(stats) // safe to keep after the call returns.
func MarshalJSON(value interface{}) ([]byte, error) {
buffer := acquireJSONBuffer()
defer releaseJSONBuffer(buffer)
encoder := json.NewEncoder(buffer)
// Keep characters like < and > unchanged so API responses match json.Marshal.
encoder.SetEscapeHTML(false)
if err := encoder.Encode(value); err != nil {
return nil, err
}
// json.Encoder.Encode adds a newline; trim it so callers get compact JSON.
data := buffer.Bytes()
if len(data) > 0 && data[len(data)-1] == '\n' {
data = data[:len(data)-1]
}
result := make([]byte, len(data))
copy(result, data)
return result, nil
}