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  }