summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-06 16:19:12 +0200
committerPaul Buetow <paul@buetow.org>2026-03-06 16:19:12 +0200
commit3348148ea989f3141e9c4cd3b68033e64cd7c276 (patch)
treed4d0bb698a423c98145b4dded3477d395ccdf5a5
parent6b646b153e10dea21e60721ed8d58c5cf8b1253e (diff)
perf: avoid per-event string allocations in event filters (task 394)
-rw-r--r--internal/eventfilter.go13
-rw-r--r--internal/eventloop_filter_test.go3
2 files changed, 12 insertions, 4 deletions
diff --git a/internal/eventfilter.go b/internal/eventfilter.go
index d49e612..43a8f51 100644
--- a/internal/eventfilter.go
+++ b/internal/eventfilter.go
@@ -1,6 +1,7 @@
package internal
import (
+ "bytes"
"fmt"
"strings"
@@ -11,8 +12,10 @@ import (
type eventFilter struct {
commFilterEnable bool
commFilter string
+ commFilterBytes []byte
pathFilterEnable bool
pathFilter string
+ pathFilterBytes []byte
}
func newEventFilter(commFilter, pathFilter string) (*eventFilter, error) {
@@ -24,6 +27,7 @@ func newEventFilter(commFilter, pathFilter string) (*eventFilter, error) {
}
ef.commFilterEnable = true
ef.commFilter = commFilter
+ ef.commFilterBytes = []byte(commFilter)
}
if pathFilter != "" {
@@ -32,6 +36,7 @@ func newEventFilter(commFilter, pathFilter string) (*eventFilter, error) {
}
ef.pathFilterEnable = true
ef.pathFilter = pathFilter
+ ef.pathFilterBytes = []byte(pathFilter)
}
return &ef, nil
@@ -48,11 +53,11 @@ func (ef *eventFilter) eventPair(ev *event.Pair) bool {
}
func (ef *eventFilter) openEvent(ev *types.OpenEvent) (*types.OpenEvent, bool) {
- if ef.commFilterEnable && !strings.Contains(string(ev.Comm[:]), ef.commFilter) {
+ if ef.commFilterEnable && !bytes.Contains(ev.Comm[:], ef.commFilterBytes) {
return ev, false
}
- if ef.pathFilterEnable && !strings.Contains(string(ev.Filename[:]), ef.pathFilter) {
+ if ef.pathFilterEnable && !bytes.Contains(ev.Filename[:], ef.pathFilterBytes) {
return ev, false
}
return ev, true
@@ -60,14 +65,14 @@ func (ef *eventFilter) openEvent(ev *types.OpenEvent) (*types.OpenEvent, bool) {
func (ef *eventFilter) pathEvent(ev *types.PathEvent) (*types.PathEvent, bool) {
if ef.pathFilterEnable {
- return ev, strings.Contains(string(ev.Pathname[:]), ef.pathFilter)
+ return ev, bytes.Contains(ev.Pathname[:], ef.pathFilterBytes)
}
return ev, true
}
func (ef *eventFilter) nameEvent(ev *types.NameEvent) (*types.NameEvent, bool) {
if ef.pathFilterEnable {
- return ev, strings.Contains(string(ev.Oldname[:]), ef.pathFilter) || strings.Contains(string(ev.Newname[:]), ef.pathFilter)
+ return ev, bytes.Contains(ev.Oldname[:], ef.pathFilterBytes) || bytes.Contains(ev.Newname[:], ef.pathFilterBytes)
}
return ev, true
}
diff --git a/internal/eventloop_filter_test.go b/internal/eventloop_filter_test.go
index e9fa91b..6418adf 100644
--- a/internal/eventloop_filter_test.go
+++ b/internal/eventloop_filter_test.go
@@ -475,6 +475,7 @@ func TestCommFilterToggle(t *testing.T) {
filter: &eventFilter{
commFilterEnable: true,
commFilter: "test",
+ commFilterBytes: []byte("test"),
},
enterEvs: make(map[uint32]*event.Pair),
files: make(map[int32]file.File),
@@ -507,8 +508,10 @@ func newEventLoopWithFilter(commFilter, pathFilter string) *eventLoop {
filter: &eventFilter{
commFilterEnable: commFilter != "",
commFilter: commFilter,
+ commFilterBytes: []byte(commFilter),
pathFilterEnable: pathFilter != "",
pathFilter: pathFilter,
+ pathFilterBytes: []byte(pathFilter),
},
enterEvs: make(map[uint32]*event.Pair),
files: make(map[int32]file.File),