summaryrefslogtreecommitdiff
path: root/internal/eventloop.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-03-11 09:52:30 +0200
committerPaul Buetow <paul@buetow.org>2025-03-11 09:52:30 +0200
commitf9d8d2d9a107204fddf13b8f60845e817076d1f8 (patch)
treeb38437d816f589dc18246290c95124fe25962e5e /internal/eventloop.go
parenta7f6f047de1e0ae56a0ef3a4c74e86f4f8f6eeb7 (diff)
refactor and initial tree
Diffstat (limited to 'internal/eventloop.go')
-rw-r--r--internal/eventloop.go98
1 files changed, 52 insertions, 46 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go
index f94ed6d..7a322a7 100644
--- a/internal/eventloop.go
+++ b/internal/eventloop.go
@@ -8,6 +8,8 @@ import (
"path/filepath"
"time"
+ "ior/internal/event"
+ "ior/internal/file"
"ior/internal/flags"
. "ior/internal/generated/types"
"ior/internal/tree"
@@ -17,11 +19,11 @@ import (
type eventLoop struct {
flags flags.Flags
filter *eventFilter
- enterEvs map[uint32]*eventPair // Temp. store of sys_enter tracepoints per Tid.
- files map[int32]file // Track all open files by file descriptor.
- comms map[uint32]string // Program or thread name of the current Tid.
- prevPairs map[uint32]*eventPair // Previous event (to calculate time differences between two events)
- tree tree.Tree // Storing all paths in a tree structure for analysis
+ enterEvs map[uint32]*event.Pair // Temp. store of sys_enter tracepoints per Tid.
+ files map[int32]file.File // Track all open files by file descriptor..
+ comms map[uint32]string // Program or thread name of the current Tid.
+ prevPairs map[uint32]*event.Pair // Previous event (to calculate time differences between two events)
+ tree tree.Tree // Storing all paths in a tree structure for analysis
// Statistics
numTracepoints uint
@@ -35,10 +37,10 @@ func newEventLoop(flags flags.Flags) *eventLoop {
return &eventLoop{
flags: flags,
filter: newEventFilter(flags),
- enterEvs: make(map[uint32]*eventPair),
- files: make(map[int32]file),
+ enterEvs: make(map[uint32]*event.Pair),
+ files: make(map[int32]file.File),
comms: make(map[uint32]string),
- prevPairs: make(map[uint32]*eventPair),
+ prevPairs: make(map[uint32]*event.Pair),
tree: tree.New(), // TODO: Implement
}
}
@@ -60,23 +62,27 @@ func (e *eventLoop) run(rawCh <-chan []byte) {
e.startTime = time.Now()
if e.flags.PprofEnable {
fmt.Println("Profiling, press Ctrl+C to stop")
- fmt.Println(eventStreamHeader)
+ fmt.Println(event.EventStreamHeader)
}
for ev := range e.events(rawCh) {
- if !e.flags.PprofEnable {
+ switch {
+ case e.flags.TreeEnable:
+ // e.tree.Add(ev)
+ case e.flags.PprofEnable:
+ default:
fmt.Println(ev.String())
}
- if ev.prevPair != nil {
+ if ev.PrevPair != nil {
// Only recycle the previous event, as the current event is the previous event of the next event!
- ev.prevPair.recycle()
+ ev.PrevPair.Recycle()
continue
}
e.numSyscallsAfterFilter++
}
}
-func (e *eventLoop) events(rawCh <-chan []byte) <-chan *eventPair {
- ch := make(chan *eventPair)
+func (e *eventLoop) events(rawCh <-chan []byte) <-chan *event.Pair {
+ ch := make(chan *event.Pair)
go func() {
defer close(ch)
@@ -114,87 +120,87 @@ func (e *eventLoop) events(rawCh <-chan []byte) <-chan *eventPair {
return ch
}
-func (e *eventLoop) syscallEnter(enterEv event) {
+func (e *eventLoop) syscallEnter(enterEv event.Event) {
tid := enterEv.GetTid()
if !e.filter.commFilterEnable {
- e.enterEvs[tid] = newEventPair(enterEv)
+ e.enterEvs[tid] = event.NewPair(enterEv)
return
}
switch enterEv.(type) {
case *OpenEvent:
- e.enterEvs[tid] = newEventPair(enterEv)
+ e.enterEvs[tid] = event.NewPair(enterEv)
default:
// Only, when we have a comm name
if _, ok := e.comms[tid]; ok {
- e.enterEvs[tid] = newEventPair(enterEv)
+ e.enterEvs[tid] = event.NewPair(enterEv)
}
}
}
-func (e *eventLoop) syscallExit(exitEv event, ch chan<- *eventPair) {
+func (e *eventLoop) syscallExit(exitEv event.Event, ch chan<- *event.Pair) {
ev, ok := e.enterEvs[exitEv.GetTid()]
if !ok {
exitEv.Recycle()
return
}
delete(e.enterEvs, exitEv.GetTid())
- ev.exitEv = exitEv
+ 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
+ if ev.EnterEv.GetTraceId()-1 != ev.ExitEv.GetTraceId() {
+ ev.TracepointMismatch = true
e.numTracepointMismatches++
} else {
e.numSyscalls++
}
- switch v := ev.enterEv.(type) {
+ switch v := ev.EnterEv.(type) {
case *OpenEvent:
- openEv := ev.enterEv.(*OpenEvent)
+ openEv := ev.EnterEv.(*OpenEvent)
- fd := int32(ev.exitEv.(*RetEvent).Ret)
- file := newFdFile(fd, string(openEv.Filename[:]))
+ fd := int32(ev.ExitEv.(*RetEvent).Ret)
+ file := file.NewFd(fd, string(openEv.Filename[:]))
if fd >= 0 {
e.files[fd] = file
}
- ev.file = file
+ ev.File = file
e.comms[openEv.Tid] = string(openEv.Comm[:])
case *NameEvent:
- nameEvent := ev.enterEv.(*NameEvent)
- ev.file = oldnameNewnameFile{
- oldname: string(nameEvent.Oldname[:]),
- newname: string(nameEvent.Newname[:]),
+ nameEvent := ev.EnterEv.(*NameEvent)
+ ev.File = file.OldnameNewnameFile{
+ Oldname: string(nameEvent.Oldname[:]),
+ Newname: string(nameEvent.Newname[:]),
}
- ev.comm = e.comm(ev.enterEv.GetTid())
+ ev.Comm = e.comm(ev.EnterEv.GetTid())
case *PathEvent:
- nameEvent := ev.enterEv.(*PathEvent)
- ev.file = pathnameFile{string(nameEvent.Pathname[:])}
- ev.comm = e.comm(ev.enterEv.GetTid())
+ nameEvent := ev.EnterEv.(*PathEvent)
+ ev.File = file.PathnameFile{string(nameEvent.Pathname[:])}
+ ev.Comm = e.comm(ev.EnterEv.GetTid())
case *FdEvent:
- fd := ev.enterEv.(*FdEvent).Fd
+ fd := ev.EnterEv.(*FdEvent).Fd
if file_, ok := e.files[fd]; ok {
- ev.file = file_
- if ev.is(SYS_ENTER_CLOSE) {
+ ev.File = file_
+ if ev.Is(SYS_ENTER_CLOSE) {
delete(e.files, fd)
}
} else {
- ev.file = newFdFileWithPid(fd, ev.enterEv.(*FdEvent).Pid)
+ ev.File = file.NewFdWithPid(fd, ev.EnterEv.(*FdEvent).Pid)
}
- ev.comm = e.comm(ev.enterEv.GetTid())
+ ev.Comm = e.comm(ev.EnterEv.GetTid())
if !e.filter.eventPair(ev) {
- ev.recycle()
+ ev.Recycle()
return
}
case *NullEvent:
- ev.comm = e.comm(ev.enterEv.GetTid())
+ ev.Comm = e.comm(ev.EnterEv.GetTid())
if !e.filter.eventPair(ev) {
- ev.recycle()
+ ev.Recycle()
return
}
@@ -202,9 +208,9 @@ func (e *eventLoop) syscallExit(exitEv event, ch chan<- *eventPair) {
panic(fmt.Sprintf("unknown type: %v", v))
}
- ev.prevPair, _ = e.prevPairs[ev.enterEv.GetTid()]
- ev.calculateDurations()
- e.prevPairs[ev.enterEv.GetTid()] = ev
+ ev.PrevPair, _ = e.prevPairs[ev.EnterEv.GetTid()]
+ ev.CalculateDurations()
+ e.prevPairs[ev.EnterEv.GetTid()] = ev
ch <- ev
}