File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -5,10 +5,18 @@ import (
55 "errors"
66 "fmt"
77 "reflect"
8+ "sync"
89
910 "github.com/vmihailenco/msgpack/v5/msgpcode"
1011)
1112
13+ var recBufPool = sync.Pool {
14+ New : func () interface {} {
15+ b := make ([]byte , 0 , 64 )
16+ return & b
17+ },
18+ }
19+
1220var (
1321 interfaceType = reflect .TypeOf ((* interface {})(nil )).Elem ()
1422 stringType = reflect .TypeOf ((* string )(nil )).Elem ()
@@ -233,17 +241,29 @@ func decodeCustomValue(d *Decoder, v reflect.Value) error {
233241}
234242
235243func unmarshalValue (d * Decoder , v reflect.Value ) error {
236- var b []byte
244+ bp := recBufPool .Get ().(* []byte )
245+ * bp = (* bp )[:0 ]
237246
238- d .rec = make ([] byte , 0 , 64 )
247+ d .rec = * bp
239248 if err := d .Skip (); err != nil {
249+ d .rec = nil
250+ * bp = (* bp )[:0 ]
251+ recBufPool .Put (bp )
240252 return err
241253 }
242- b = d .rec
254+ b : = d .rec
243255 d .rec = nil
244256
245257 unmarshaler := v .Interface ().(Unmarshaler )
246- return unmarshaler .UnmarshalMsgpack (b )
258+ err := unmarshaler .UnmarshalMsgpack (b )
259+
260+ // Return buffer to pool; drop oversized buffers.
261+ if cap (b ) <= 4096 {
262+ * bp = b
263+ recBufPool .Put (bp )
264+ }
265+
266+ return err
247267}
248268
249269// unmarshalBinaryOrTextValue peeks at the wire format to choose between
You can’t perform that action at this time.
0 commit comments