github.com/grafana/pyroscope@v1.18.0/pkg/model/tree_merger.go (about) 1 package model 2 3 import ( 4 "sync" 5 ) 6 7 type TreeMerger struct { 8 mu sync.Mutex 9 t *Tree 10 } 11 12 func NewTreeMerger() *TreeMerger { 13 return new(TreeMerger) 14 } 15 16 func (m *TreeMerger) MergeTree(t *Tree) { 17 m.mu.Lock() 18 defer m.mu.Unlock() 19 if m.t != nil { 20 m.t.Merge(t) 21 } else { 22 m.t = t 23 } 24 } 25 26 func (m *TreeMerger) MergeTreeBytes(b []byte) error { 27 // TODO(kolesnikovae): Ideally, we should not have 28 // the intermediate tree t but update m.t reading 29 // raw bytes b directly. 30 t, err := UnmarshalTree(b) 31 if err != nil { 32 return err 33 } 34 m.MergeTree(t) 35 return nil 36 } 37 38 func (m *TreeMerger) Tree() *Tree { 39 if m.t == nil { 40 return new(Tree) 41 } 42 return m.t 43 } 44 45 func (m *TreeMerger) IsEmpty() bool { 46 return m.t == nil 47 }