mirror of
https://github.com/amir20/dozzle.git
synced 2025-12-24 06:28:42 +01:00
fix: fixes race issues (#2747)
This commit is contained in:
@@ -1,11 +1,15 @@
|
||||
package utils
|
||||
|
||||
import "encoding/json"
|
||||
import (
|
||||
"encoding/json"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type RingBuffer[T any] struct {
|
||||
Size int
|
||||
data []T
|
||||
start int
|
||||
mutex sync.RWMutex
|
||||
}
|
||||
|
||||
func NewRingBuffer[T any](size int) *RingBuffer[T] {
|
||||
@@ -16,6 +20,8 @@ func NewRingBuffer[T any](size int) *RingBuffer[T] {
|
||||
}
|
||||
|
||||
func (r *RingBuffer[T]) Push(data T) {
|
||||
r.mutex.Lock()
|
||||
defer r.mutex.Unlock()
|
||||
if len(r.data) == r.Size {
|
||||
r.data[r.start] = data
|
||||
r.start = (r.start + 1) % r.Size
|
||||
@@ -25,6 +31,8 @@ func (r *RingBuffer[T]) Push(data T) {
|
||||
}
|
||||
|
||||
func (r *RingBuffer[T]) Data() []T {
|
||||
r.mutex.RLock()
|
||||
defer r.mutex.RUnlock()
|
||||
if len(r.data) == r.Size {
|
||||
return append(r.data[r.start:], r.data[:r.start]...)
|
||||
} else {
|
||||
@@ -32,14 +40,6 @@ func (r *RingBuffer[T]) Data() []T {
|
||||
}
|
||||
}
|
||||
|
||||
func (r *RingBuffer[T]) Len() int {
|
||||
return len(r.data)
|
||||
}
|
||||
|
||||
func (r *RingBuffer[T]) Full() bool {
|
||||
return len(r.data) == r.Size
|
||||
}
|
||||
|
||||
func (r *RingBuffer[T]) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(r.Data())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user