diff options
| author | Paul Buetow <paul@buetow.org> | 2025-03-11 09:52:30 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-03-11 09:52:30 +0200 |
| commit | f9d8d2d9a107204fddf13b8f60845e817076d1f8 (patch) | |
| tree | b38437d816f589dc18246290c95124fe25962e5e /internal/event | |
| parent | a7f6f047de1e0ae56a0ef3a4c74e86f4f8f6eeb7 (diff) | |
refactor and initial tree
Diffstat (limited to 'internal/event')
| -rw-r--r-- | internal/event/event.go | 97 |
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) +} |
