summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-02-16 21:09:25 +0200
committerPaul Buetow <paul@buetow.org>2024-02-16 21:09:25 +0200
commit93c8f346b3e6c06e46967ce8388367512e0e03d7 (patch)
treeff4b738796cb570475f124eabe21a4e2d7026d8a
parent202c3c4e6fe6bd8082e221f8866dd1d55a398636 (diff)
add buffertools
-rw-r--r--internal/ioriotng.go39
-rw-r--r--internal/types/bufferpools.go21
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{}
+ },
+}