summaryrefslogtreecommitdiff
path: root/internal/eventloop.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-08 11:24:31 +0200
committerPaul Buetow <paul@buetow.org>2026-03-08 11:24:31 +0200
commit9cbf9ec8e9eac92431b9a742c1b625888cb69dfa (patch)
tree1bd9b8c24faecaf65a9563dd922afcfacddaa4ce /internal/eventloop.go
parent742ef1480ee52558b77e1be1671e17065af36a1d (diff)
eventloop: remove gosched by snapshotting emitted fd state
Diffstat (limited to 'internal/eventloop.go')
-rw-r--r--internal/eventloop.go13
1 files changed, 9 insertions, 4 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go
index 64c7d6f..2c3cf49 100644
--- a/internal/eventloop.go
+++ b/internal/eventloop.go
@@ -8,7 +8,6 @@ import (
"os"
"path/filepath"
"reflect"
- "runtime"
"sync"
"syscall"
"time"
@@ -408,9 +407,6 @@ func (e *eventLoop) events(ctx context.Context, rawCh <-chan []byte) <-chan *eve
continue
}
e.processRawEvent(raw, ch)
- // Yield so downstream consumers can process emitted pairs before
- // the next raw event mutates shared tracker state.
- runtime.Gosched()
case <-ctx.Done():
fmt.Println("Stopping event loop")
return
@@ -593,9 +589,18 @@ func (e *eventLoop) tracepointExited(exitEv event.Event, ch chan<- *event.Pair)
prevPairTime, _ := e.prevPairTimes[ep.EnterEv.GetTid()]
ep.CalculateDurations(prevPairTime)
e.prevPairTimes[ep.EnterEv.GetTid()] = ep.ExitEv.GetTime()
+ e.freezePairForEmission(ep)
ch <- ep
}
+func (e *eventLoop) freezePairForEmission(ep *event.Pair) {
+ fdFile, ok := ep.File.(*file.FdFile)
+ if !ok {
+ return
+ }
+ ep.File = fdFile.Dup(fdFile.FD())
+}
+
func (e *eventLoop) initExitHandlers() {
e.exitHandlers = map[reflect.Type]tracepointExitHandler{
reflect.TypeOf(&types.OpenEvent{}): func(ep *event.Pair) bool {