diff options
| author | Paul Buetow <paul@buetow.org> | 2025-03-06 21:14:02 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-03-06 21:14:02 +0200 |
| commit | 10925e4fda4af9211ee0b697f3139df500ff3679 (patch) | |
| tree | ff3277b4827dc8c5755dd50256acfb39205a01af | |
| parent | fe7f16e4fcf7ee13f55321691072bf02071df58c (diff) | |
refactor
| -rw-r--r-- | internal/eventloop.go | 162 |
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 +} |
