diff options
Diffstat (limited to 'internal/eventloop.go')
| -rw-r--r-- | internal/eventloop.go | 77 |
1 files changed, 29 insertions, 48 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go index d15c221..1d161dd 100644 --- a/internal/eventloop.go +++ b/internal/eventloop.go @@ -19,69 +19,50 @@ func (o openFile) String() string { return fmt.Sprintf("(%d) %s", o.fd, o.path) } -type Event interface { - String() string - TID() uint32 - Timestamp() uint32 - Recycle() -} - -type Syscall struct { - enterEv, exitEv Event -} +func eventLoop(bpfModule *bpf.Module, ch <-chan []byte) { + enterEvs := make(map[uint32]enterExitEvent) + evCh := make(chan enterExitEvent) -func (s Syscall) String() string { - return "" -} + enter := func(enterEv event) { + enterEvs[enterEv.GetTid()] = enterExitEvent{ + enterEv: enterEv, + } + } -func human(enterEv, exitEv Event) string { - return fmt.Sprintf("%08d µs %s %s", - exitEv.Timestamp()-enterEv.Timestamp(), enterEv, exitEv) -} + exit := func(exitEv event) { + ev, ok := enterEvs[exitEv.GetTid()] + if !ok { + exitEv.Recycle() + return + } + delete(enterEvs, exitEv.GetTid()) + ev.exitEv = exitEv + evCh <- ev + } -func eventLoop(bpfModule *bpf.Module, ch <-chan []byte) { - enterEvs := make(map[uint32]Event) + go func() { + for ev := range evCh { + fmt.Println(ev.dump()) + } + }() for raw := range ch { - var exitEv Event - switch EventType(raw[0]) { case ENTER_OPEN_EVENT: - ev := NewOpenEnterEvent(raw) - enterEvs[ev.Tid] = ev + enter(NewOpenEnterEvent(raw)) case EXIT_OPEN_EVENT: - ev := NewFdEvent(raw) - if enterEv, ok := enterEvs[ev.Tid]; ok { - fmt.Println(human(enterEv, ev)) - delete(enterEvs, ev.Tid) - enterEv.Recycle() - } - ev.Recycle() - + exit(NewFdEvent(raw)) case ENTER_FD_EVENT: - ev := NewFdEvent(raw) - enterEvs[ev.Tid] = ev + enter(NewFdEvent(raw)) case EXIT_FD_EVENT: - exitEv = NewFdEvent(raw) + exit(NewFdEvent(raw)) case EXIT_NULL_EVENT: - exitEv = NewNullEvent(raw) + exit(NewNullEvent(raw)) case EXIT_RET_EVENT: - exitEv = NewRetEvent(raw) + exit(NewRetEvent(raw)) default: panic(fmt.Sprintf("Unknown event type %s", EventType(raw[0]))) } - - if exitEv == nil { - continue - } - - if enterEv, ok := enterEvs[exitEv.TID()]; ok { - fmt.Println(human(enterEv, exitEv)) - delete(enterEvs, exitEv.TID()) - enterEv.Recycle() - } - - exitEv.Recycle() } fmt.Println("Good bye") |
