diff --git a/component/runchart/runchart.go b/component/runchart/runchart.go index e69e863..be02c36 100644 --- a/component/runchart/runchart.go +++ b/component/runchart/runchart.go @@ -187,7 +187,6 @@ func (c *RunChart) consumeSample(sample *data.Sample) { line.points = append(line.points, c.newTimePoint(float)) c.lines[index] = line - // perform cleanup once in a while if len(line.points)%100 == 0 { c.trimOutOfRangeValues() } diff --git a/component/sparkline/sparkline.go b/component/sparkline/sparkline.go index 09735a3..3bb4184 100644 --- a/component/sparkline/sparkline.go +++ b/component/sparkline/sparkline.go @@ -8,6 +8,7 @@ import ( "github.com/sqshq/sampler/console" "github.com/sqshq/sampler/data" "image" + "sync" ) type SparkLine struct { @@ -20,6 +21,7 @@ type SparkLine struct { scale int gradient []ui.Color palette console.Palette + mutex *sync.Mutex } func NewSparkLine(c config.SparkLineConfig, palette console.Palette) *SparkLine { @@ -31,6 +33,7 @@ func NewSparkLine(c config.SparkLineConfig, palette console.Palette) *SparkLine scale: *c.Scale, gradient: *c.Gradient, palette: palette, + mutex: &sync.Mutex{}, } go func() { @@ -78,11 +81,13 @@ func (s *SparkLine) consumeSample(sample *data.Sample) { s.minValue = min if len(s.values)%100 == 0 { - s.cleanup(s.Dx()) + s.mutex.Lock() + s.trimOutOfRangeValues(s.Dx()) + s.mutex.Unlock() } } -func (s *SparkLine) cleanup(maxSize int) { +func (s *SparkLine) trimOutOfRangeValues(maxSize int) { if maxSize < len(s.values) { s.values = append(s.values[:0], s.values[len(s.values)-maxSize:]...) } @@ -90,6 +95,8 @@ func (s *SparkLine) cleanup(maxSize int) { func (s *SparkLine) Draw(buffer *ui.Buffer) { + s.mutex.Lock() + textStyle := ui.NewStyle(s.palette.BaseColor) height := s.Dy() - 2 @@ -131,6 +138,8 @@ func (s *SparkLine) Draw(buffer *ui.Buffer) { } } + s.mutex.Unlock() + s.Block.Draw(buffer) component.RenderAlert(s.alert, s.Rectangle, buffer) } diff --git a/component/sparkline/sparkline_test.go b/component/sparkline/sparkline_test.go index 575f243..b9edac8 100644 --- a/component/sparkline/sparkline_test.go +++ b/component/sparkline/sparkline_test.go @@ -4,7 +4,7 @@ import ( "testing" ) -func TestSparkLine_cleanup(t *testing.T) { +func TestSparkLine_trimOutOfRangeValues(t *testing.T) { type Sparkline struct { maxSize int expectedSize int @@ -14,17 +14,17 @@ func TestSparkLine_cleanup(t *testing.T) { name string sparkline Sparkline }{ - {"should cleanup values to the max size", Sparkline{maxSize: 5, expectedSize: 5, values: []float64{1, 2, 3, 4, 5, 6, 7, 8}}}, - {"should not cleanup values if max size is bigger than values len", Sparkline{maxSize: 5, expectedSize: 3, values: []float64{1, 2, 3}}}, + {"should trimOutOfRangeValues values to the max size", Sparkline{maxSize: 5, expectedSize: 5, values: []float64{1, 2, 3, 4, 5, 6, 7, 8}}}, + {"should not trimOutOfRangeValues values if max size is bigger than values len", Sparkline{maxSize: 5, expectedSize: 3, values: []float64{1, 2, 3}}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := &SparkLine{ values: tt.sparkline.values, } - s.cleanup(tt.sparkline.maxSize) + s.trimOutOfRangeValues(tt.sparkline.maxSize) if len(s.values) != tt.sparkline.expectedSize { - t.Errorf("Values size after cleanup is %v, but needed to be %v", len(s.values), tt.sparkline.expectedSize) + t.Errorf("Values size after trimOutOfRangeValues is %v, but needed to be %v", len(s.values), tt.sparkline.expectedSize) } }) }