summaryrefslogtreecommitdiff
path: root/internal/eventloop.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/eventloop.go')
-rw-r--r--internal/eventloop.go77
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")