summaryrefslogtreecommitdiff
path: root/internal/io/line
diff options
context:
space:
mode:
Diffstat (limited to 'internal/io/line')
-rw-r--r--internal/io/line/line.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/internal/io/line/line.go b/internal/io/line/line.go
index d306c88..c168274 100644
--- a/internal/io/line/line.go
+++ b/internal/io/line/line.go
@@ -3,8 +3,17 @@ package line
import (
"bytes"
"fmt"
+ "sync"
)
+// lineBuffer is there to optimize memory allocations. DTail otherwise allocates
+// a lot of memory while reading logs.
+var lineBuffer = sync.Pool{
+ New: func() interface{} {
+ return &Line{}
+ },
+}
+
// Line represents a read log line.
type Line struct {
// The content of the log line.
@@ -23,6 +32,22 @@ type Line struct {
SourceID string
}
+func New(content *bytes.Buffer, count uint64, transmittedPerc int, sourceID string) *Line {
+ l := lineBuffer.Get().(*Line)
+ l.Content = content
+ l.Count = count
+ l.TransmittedPerc = transmittedPerc
+ l.SourceID = sourceID
+ return l
+}
+
+// Null returns a new line with all members initialized to their null value.
+func Null() *Line {
+ l := lineBuffer.Get().(*Line)
+ l.NullValues()
+ return l
+}
+
// Return a human readable representation of the followed line.
func (l Line) String() string {
return fmt.Sprintf("Line(Content:%s,TransmittedPerc:%v,Count:%v,SourceID:%s)",
@@ -31,3 +56,19 @@ func (l Line) String() string {
l.Count,
l.SourceID)
}
+
+// Recycle the line. Once done, don't reuse this instance!!!
+func (l *Line) Recycle() {
+ // No explicit reset required, as NewLine overrides all elements
+ // already takes care of it.
+ //l.Reset()
+ lineBuffer.Put(l)
+}
+
+// NullValues nulls all line struct members to their default state.
+func (l *Line) NullValues() {
+ l.Content = nil
+ l.Count = 0
+ l.TransmittedPerc = 0
+ l.SourceID = ""
+}