summaryrefslogtreecommitdiff
path: root/internal/event
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-03-11 09:52:30 +0200
committerPaul Buetow <paul@buetow.org>2025-03-11 09:52:30 +0200
commitf9d8d2d9a107204fddf13b8f60845e817076d1f8 (patch)
treeb38437d816f589dc18246290c95124fe25962e5e /internal/event
parenta7f6f047de1e0ae56a0ef3a4c74e86f4f8f6eeb7 (diff)
refactor and initial tree
Diffstat (limited to 'internal/event')
-rw-r--r--internal/event/event.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/internal/event/event.go b/internal/event/event.go
new file mode 100644
index 0000000..db8028c
--- /dev/null
+++ b/internal/event/event.go
@@ -0,0 +1,97 @@
+package event
+
+import (
+ "fmt"
+ "ior/internal/file"
+ . "ior/internal/generated/types"
+ "strconv"
+ "strings"
+ "sync"
+)
+
+var poolOfEventPairs = sync.Pool{
+ New: func() interface{} { return &Pair{} },
+}
+
+type Event interface {
+ String() string
+ GetTraceId() TraceId
+ GetPid() uint32
+ GetTid() uint32
+ GetTime() uint64
+ Recycle()
+}
+
+// Represents a pair of enter and exit events (e.g. entering the syscall + exiting it)
+type Pair struct {
+ EnterEv, ExitEv Event
+ File file.File
+ Comm string
+ duration uint64
+ TracepointMismatch bool
+
+ // To calculate the time difference from the previoud event.
+ PrevPair *Pair
+ durationToPrev uint64
+}
+
+func NewPair(enterEv Event) *Pair {
+ e := poolOfEventPairs.Get().(*Pair)
+ e.EnterEv = enterEv
+ return e
+}
+
+func (e *Pair) CalculateDurations() {
+ e.duration = e.ExitEv.GetTime() - e.EnterEv.GetTime()
+
+ if e.PrevPair != nil {
+ e.durationToPrev = e.EnterEv.GetTime() - e.PrevPair.ExitEv.GetTime()
+ }
+}
+
+func (e *Pair) Is(id TraceId) bool {
+ return e.EnterEv.GetTraceId() == id
+}
+
+const EventStreamHeader = "durationToPrevNs,durationNs,comm,pid.tid,name,ret,notice,file"
+
+func (e *Pair) String() string {
+ var sb strings.Builder
+
+ sb.WriteString(fmt.Sprintf("%08d,%08d", e.durationToPrev, e.duration))
+
+ sb.WriteString(",")
+ sb.WriteString(e.Comm)
+
+ sb.WriteString(",")
+ sb.WriteString(strconv.FormatInt(int64(e.EnterEv.GetPid()), 10))
+ sb.WriteString(".")
+ sb.WriteString(strconv.FormatInt(int64(e.EnterEv.GetTid()), 10))
+
+ sb.WriteString(",")
+ sb.WriteString(e.EnterEv.GetTraceId().Name())
+
+ sb.WriteString(",")
+ if retEv, ok := e.ExitEv.(*RetEvent); ok {
+ sb.WriteString(strconv.FormatInt(int64(retEv.Ret), 10))
+ }
+
+ sb.WriteString(",")
+ sb.WriteString(e.File.String())
+
+ if e.TracepointMismatch {
+ sb.WriteString(",MISMATCH")
+ }
+ return sb.String()
+}
+
+func (e *Pair) Dump() string {
+ return fmt.Sprintf("%v with enterEv(%v) and exitEv(%v)", e, e.EnterEv, e.ExitEv)
+}
+
+func (e *Pair) Recycle() {
+ e.EnterEv.Recycle()
+ e.ExitEv.Recycle()
+ e.PrevPair = nil
+ poolOfEventPairs.Put(e)
+}