summaryrefslogtreecommitdiff
path: root/internal/eventloop.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/eventloop.go')
-rw-r--r--internal/eventloop.go64
1 files changed, 37 insertions, 27 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go
index d22ea62..cffb941 100644
--- a/internal/eventloop.go
+++ b/internal/eventloop.go
@@ -3,8 +3,6 @@ package internal
import "C"
import (
- "bytes"
- "encoding/binary"
"fmt"
. "ioriotng/internal/generated/types"
@@ -21,47 +19,59 @@ func (o openFile) String() string {
return fmt.Sprintf("(%d) %s", o.fd, o.path)
}
-func binaryCompare(ev *OpenEnterEvent, raw []byte) {
- buf := new(bytes.Buffer)
- if err := binary.Write(buf, binary.LittleEndian, *ev); err != nil {
- panic(err)
- }
- bytes := buf.Bytes()
- fmt.Println("bytes", bytes)
- fmt.Println("raw ", raw)
-}
-
type Event interface {
String() string
- GetTid() uint32
+ TID() uint32
+ Timestamp() uint32
+ Recycle()
+}
+
+func human(enterEv, exitEv Event) string {
+ return fmt.Sprintf("%08d µs %s %s",
+ exitEv.Timestamp()-enterEv.Timestamp(), enterEv, exitEv)
}
func eventLoop(bpfModule *bpf.Module, ch <-chan []byte) {
- type Event interface {
- String() string
- }
+ enterEvs := make(map[uint32]Event)
for raw := range ch {
- var ev Event
+ var exitEv Event
+
switch EventType(raw[0]) {
case ENTER_OPEN_EVENT:
- ev = NewOpenEnterEvent(raw)
+ ev := NewOpenEnterEvent(raw)
+ enterEvs[ev.Tid] = ev
case EXIT_OPEN_EVENT:
- ev = NewFdEvent(raw)
+ ev := NewFdEvent(raw)
+ if enterEv, ok := enterEvs[ev.Tid]; ok {
+ fmt.Println(human(enterEv, ev))
+ enterEv.Recycle()
+ }
+ ev.Recycle()
+
case ENTER_FD_EVENT:
- ev = NewFdEvent(raw)
+ ev := NewFdEvent(raw)
+ enterEvs[ev.Tid] = ev
case EXIT_FD_EVENT:
- ev = NewFdEvent(raw)
- case ENTER_NULL_EVENT:
- ev = NewNullEvent(raw)
+ exitEv = NewFdEvent(raw)
case EXIT_NULL_EVENT:
- ev = NewNullEvent(raw)
+ exitEv = NewNullEvent(raw)
case EXIT_RET_EVENT:
- ev = NewRetEvent(raw)
+ exitEv = NewRetEvent(raw)
default:
- panic("Unknown event type")
+ panic(fmt.Sprintf("Unknown event type %s", EventType(raw[0])))
+ }
+
+ if exitEv == nil {
+ continue
}
- fmt.Println(ev)
+
+ if enterEv, ok := enterEvs[exitEv.TID()]; ok {
+ fmt.Println(human(enterEv, exitEv))
+ enterEv.Recycle()
+ }
+
+ exitEv.Recycle()
}
fmt.Println("Good bye")