diff options
| author | Paul Buetow <paul@buetow.org> | 2024-02-16 21:09:25 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-02-16 21:09:25 +0200 |
| commit | 93c8f346b3e6c06e46967ce8388367512e0e03d7 (patch) | |
| tree | ff4b738796cb570475f124eabe21a4e2d7026d8a | |
| parent | 202c3c4e6fe6bd8082e221f8866dd1d55a398636 (diff) | |
add buffertools
| -rw-r--r-- | internal/ioriotng.go | 39 | ||||
| -rw-r--r-- | internal/types/bufferpools.go | 21 |
2 files changed, 47 insertions, 13 deletions
diff --git a/internal/ioriotng.go b/internal/ioriotng.go index a95892c..d86cd85 100644 --- a/internal/ioriotng.go +++ b/internal/ioriotng.go @@ -48,37 +48,50 @@ func Run(flags flags.Flags) { log.Fatal(err) } - ch := make(chan []byte) + ch := make(chan []byte, 1024) rb, err := bpfModule.InitRingBuf("event_map", ch) if err != nil { log.Fatal(err) } rb.Poll(300) + enter := make(map[uint32]*types.OpenatEnterEvent) + for raw := range ch { switch types.OpId(raw[0]) { - // TODO: Actually, need one ring buffer event per enter/exit ... otherwise may be difficult to capture - // what belongs to what in event based / multiplexed applications. case types.OPENAT_ENTER_OP_ID: - var ev types.OpenatEnterEvent - if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, &ev); err != nil { + ev := types.OpenEnterEventPool.Get().(*types.OpenatEnterEvent) + if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, ev); err != nil { log.Fatal(err) } - fmt.Println(ev) + enter[ev.Tid] = ev case types.OPENAT_EXIT_OP_ID: - fallthrough + ev := types.FdEventPool.Get().(*types.FdEvent) + if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, ev); err != nil { + log.Fatal(err) + } + enterEv, ok := enter[ev.Tid] + if !ok { + fmt.Println("Dropping", ev) + types.FdEventPool.Put(ev) + continue + } + fmt.Println(enterEv, ev) + delete(enter, ev.Tid) + types.FdEventPool.Put(ev) + types.OpenEnterEventPool.Put(enterEv) case types.CLOSE_ENTER_OP_ID: - var ev types.FdEvent - if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, &ev); err != nil { + ev := types.FdEventPool.Get().(*types.FdEvent) + if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, ev); err != nil { log.Fatal(err) } - fmt.Println(ev) + types.FdEventPool.Put(ev) case types.CLOSE_EXIT_OP_ID: - var ev types.NullEvent - if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, &ev); err != nil { + ev := types.NullEventPool.Get().(*types.NullEvent) + if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, ev); err != nil { log.Fatal(err) } - fmt.Println(ev) + types.NullEventPool.Put(ev) default: panic(fmt.Sprintf("UNKNOWN Ringbuf data received len:%d raw:%v", len(raw), raw)) } diff --git a/internal/types/bufferpools.go b/internal/types/bufferpools.go new file mode 100644 index 0000000..bca22fe --- /dev/null +++ b/internal/types/bufferpools.go @@ -0,0 +1,21 @@ +package types + +import "sync" + +var OpenEnterEventPool = sync.Pool{ + New: func() interface{} { + return &OpenatEnterEvent{} + }, +} + +var FdEventPool = sync.Pool{ + New: func() interface{} { + return &FdEvent{} + }, +} + +var NullEventPool = sync.Pool{ + New: func() interface{} { + return &NullEvent{} + }, +} |
