aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/pool.go38
-rw-r--r--core/state_backend.go18
2 files changed, 54 insertions, 2 deletions
diff --git a/core/pool.go b/core/pool.go
new file mode 100644
index 0000000..484b342
--- /dev/null
+++ b/core/pool.go
@@ -0,0 +1,38 @@
1package core
2
3import "sync"
4
5
6const (
7 DefaultBufferSize = 1024
8 MaxBufferSize = 64 * 1024
9)
10
11var bytesPool = sync.Pool{
12 New: func () any {
13 b := make([]byte, DefaultBufferSize)
14 return &b
15 },
16}
17
18func GetBuffer(size int) []byte {
19 bufPtr := bytesPool.Get().(*[]byte)
20
21 buf := *bufPtr
22
23
24 if size > cap(buf) {
25 buf = make([]byte, size)
26 }
27
28 return buf[:size]
29}
30
31
32func PutBuffer(buf []byte) {
33 if cap(buf) < MaxBufferSize{
34 // reset
35 buf = buf[:0]
36 bytesPool.Put(&buf)
37 }
38}
diff --git a/core/state_backend.go b/core/state_backend.go
index 5870739..ae9fe1d 100644
--- a/core/state_backend.go
+++ b/core/state_backend.go
@@ -2,6 +2,9 @@ package core
2 2
3import ( 3import (
4 "context" 4 "context"
5 "encoding/json"
6 "fmt"
7
5) 8)
6 9
7type StateBackend interface { 10type StateBackend interface {
@@ -22,6 +25,7 @@ type stateBackendKeyType struct{}
22 25
23var stateBackendKey stateBackendKeyType 26var stateBackendKey stateBackendKeyType
24 27
28// type adapter
25type typedValueState[T any] struct { 29type typedValueState[T any] struct {
26 inner ValueState[any] 30 inner ValueState[any]
27} 31}
@@ -32,14 +36,24 @@ func CastValueType[T any](inner ValueState[any]) ValueState[T] {
32 36
33func (s *typedValueState[T]) Value(ctx context.Context) (T, error) { 37func (s *typedValueState[T]) Value(ctx context.Context) (T, error) {
34 val, err := s.inner.Value(ctx) 38 val, err := s.inner.Value(ctx)
39 var zero T
35 if err != nil { 40 if err != nil {
36 var zero T
37 return zero, err 41 return zero, err
38 } 42 }
39 if val == nil { 43 if val == nil {
40 var zero T
41 return zero, nil 44 return zero, nil
42 } 45 }
46
47 if rawBytes, ok := val.([]byte); ok {
48 defer PutBuffer(rawBytes)
49
50 var result T
51 if err := json.Unmarshal(rawBytes, &result); err != nil {
52 return zero, fmt.Errorf("failed to unmarshal state: %w", err)
53 }
54 return result, nil
55 }
56
43 return val.(T), nil 57 return val.(T), nil
44} 58}
45 59