summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-03-06 21:14:02 +0200
committerPaul Buetow <paul@buetow.org>2025-03-06 21:14:02 +0200
commit10925e4fda4af9211ee0b697f3139df500ff3679 (patch)
treeff3277b4827dc8c5755dd50256acfb39205a01af /internal
parentfe7f16e4fcf7ee13f55321691072bf02071df58c (diff)
refactor
Diffstat (limited to 'internal')
-rw-r--r--internal/eventloop.go162
1 files changed, 80 insertions, 82 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go
index 0dca083..4c582e3 100644
--- a/internal/eventloop.go
+++ b/internal/eventloop.go
@@ -40,101 +40,27 @@ func (e *eventLoop) run(rawCh <-chan []byte) {
}
func (e *eventLoop) events(rawCh <-chan []byte) <-chan *eventPair {
- // Syscall entered
- enter := func(enterEv event) {
- e.enterEvs[enterEv.GetTid()] = newEventPair(enterEv)
- }
-
- // Syscall exited
- exit := func(exitEv event) {
- ev, ok := e.enterEvs[exitEv.GetTid()]
- if !ok {
- exitEv.Recycle()
- return
- }
- delete(e.enterEvs, exitEv.GetTid())
- ev.exitEv = exitEv
-
- // Expect ID one lower, otherwise, enter and exit tracepoints
- // don't match up. E.g.:
- // enterEv:SYS_ENTER_OPEN => exitEv:SYS_EXIT_OPEN
- if ev.enterEv.GetTraceId()-1 != ev.exitEv.GetTraceId() {
- ev.tracepointMismatch = true
- }
-
- switch v := ev.enterEv.(type) {
- case *OpenEvent:
- openEv := ev.enterEv.(*OpenEvent)
-
- fd := int32(ev.exitEv.(*RetEvent).Ret)
- file := fdFile{fd, string(openEv.Filename[:])}
- if fd >= 0 {
- e.files[fd] = file
- }
- ev.file = file
-
- comm := string(openEv.Comm[:])
- e.comms[openEv.Tid] = comm
-
- case *NameEvent:
- nameEvent := ev.enterEv.(*NameEvent)
- ev.file = oldnameNewnameFile{
- oldname: string(nameEvent.Oldname[:]),
- newname: string(nameEvent.Newname[:]),
- }
- ev.comm, _ = e.comms[ev.enterEv.GetTid()]
-
- case *PathEvent:
- nameEvent := ev.enterEv.(*PathEvent)
- ev.file = pathnameFile{string(nameEvent.Pathname[:])}
- ev.comm, _ = e.comms[ev.enterEv.GetTid()]
-
- case *FdEvent:
- fd := ev.enterEv.(*FdEvent).Fd
- if file_, ok := e.files[fd]; ok {
- ev.file = file_
- if ev.is(SYS_ENTER_CLOSE) {
- delete(e.files, fd)
- }
- } else {
- ev.file = fdFile{fd, "?"}
- }
- ev.comm, _ = e.comms[ev.enterEv.GetTid()]
-
- case *NullEvent:
- ev.comm, _ = e.comms[ev.enterEv.GetTid()]
-
- default:
- panic(fmt.Sprintf("unknown type: %v", v))
- }
-
- ev.prevPair, _ = e.prevPairs[ev.enterEv.GetTid()]
- ev.calculateDurations()
- e.prevPairs[ev.enterEv.GetTid()] = ev
- e.evCh <- ev
- }
-
// Deserialise raw byte stream from BPF ringbuffer.
go func() {
defer close(e.evCh)
for raw := range rawCh {
switch EventType(raw[0]) {
case ENTER_OPEN_EVENT:
- enter(NewOpenEvent(raw))
+ e.syscallEnter(NewOpenEvent(raw))
case EXIT_OPEN_EVENT:
- exit(NewFdEvent(raw))
+ e.syscallExit(NewFdEvent(raw))
case ENTER_FD_EVENT:
- enter(NewFdEvent(raw))
+ e.syscallEnter(NewFdEvent(raw))
case EXIT_FD_EVENT:
- exit(NewFdEvent(raw))
+ e.syscallExit(NewFdEvent(raw))
case EXIT_NULL_EVENT:
- exit(NewNullEvent(raw))
+ e.syscallExit(NewNullEvent(raw))
case EXIT_RET_EVENT:
- exit(NewRetEvent(raw))
+ e.syscallExit(NewRetEvent(raw))
case ENTER_NAME_EVENT:
- enter(NewNameEvent(raw))
+ e.syscallEnter(NewNameEvent(raw))
case ENTER_PATH_EVENT:
- enter(NewPathEvent(raw))
+ e.syscallEnter(NewPathEvent(raw))
default:
panic(fmt.Sprintf("unhandled event type %v: %v", EventType(raw[0]), raw))
}
@@ -143,3 +69,75 @@ func (e *eventLoop) events(rawCh <-chan []byte) <-chan *eventPair {
return e.evCh
}
+
+func (e *eventLoop) syscallEnter(enterEv event) {
+ e.enterEvs[enterEv.GetTid()] = newEventPair(enterEv)
+}
+
+func (e *eventLoop) syscallExit(exitEv event) {
+ ev, ok := e.enterEvs[exitEv.GetTid()]
+ if !ok {
+ exitEv.Recycle()
+ return
+ }
+ delete(e.enterEvs, exitEv.GetTid())
+ ev.exitEv = exitEv
+
+ // Expect ID one lower, otherwise, enter and exit tracepoints
+ // don't match up. E.g.:
+ // enterEv:SYS_ENTER_OPEN => exitEv:SYS_EXIT_OPEN
+ if ev.enterEv.GetTraceId()-1 != ev.exitEv.GetTraceId() {
+ ev.tracepointMismatch = true
+ }
+
+ switch v := ev.enterEv.(type) {
+ case *OpenEvent:
+ openEv := ev.enterEv.(*OpenEvent)
+
+ fd := int32(ev.exitEv.(*RetEvent).Ret)
+ file := fdFile{fd, string(openEv.Filename[:])}
+ if fd >= 0 {
+ e.files[fd] = file
+ }
+ ev.file = file
+
+ comm := string(openEv.Comm[:])
+ e.comms[openEv.Tid] = comm
+
+ case *NameEvent:
+ nameEvent := ev.enterEv.(*NameEvent)
+ ev.file = oldnameNewnameFile{
+ oldname: string(nameEvent.Oldname[:]),
+ newname: string(nameEvent.Newname[:]),
+ }
+ ev.comm, _ = e.comms[ev.enterEv.GetTid()]
+
+ case *PathEvent:
+ nameEvent := ev.enterEv.(*PathEvent)
+ ev.file = pathnameFile{string(nameEvent.Pathname[:])}
+ ev.comm, _ = e.comms[ev.enterEv.GetTid()]
+
+ case *FdEvent:
+ fd := ev.enterEv.(*FdEvent).Fd
+ if file_, ok := e.files[fd]; ok {
+ ev.file = file_
+ if ev.is(SYS_ENTER_CLOSE) {
+ delete(e.files, fd)
+ }
+ } else {
+ ev.file = fdFile{fd, "?"}
+ }
+ ev.comm, _ = e.comms[ev.enterEv.GetTid()]
+
+ case *NullEvent:
+ ev.comm, _ = e.comms[ev.enterEv.GetTid()]
+
+ default:
+ panic(fmt.Sprintf("unknown type: %v", v))
+ }
+
+ ev.prevPair, _ = e.prevPairs[ev.enterEv.GetTid()]
+ ev.calculateDurations()
+ e.prevPairs[ev.enterEv.GetTid()] = ev
+ e.evCh <- ev
+}