diff options
| author | Paul Buetow <paul@buetow.org> | 2025-03-11 22:42:57 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-03-11 22:42:57 +0200 |
| commit | 2cf6f74135b830885bad25e4f6aba3e0e31581b8 (patch) | |
| tree | 4bb0249a01cd78ca4385e865f0ecd0c2d1601156 /internal/eventloop.go | |
| parent | 41e2d2661faa4d72ab6f03e7f1ba702593754d97 (diff) | |
more on tree
Diffstat (limited to 'internal/eventloop.go')
| -rw-r--r-- | internal/eventloop.go | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go index 7a322a7..f6cd410 100644 --- a/internal/eventloop.go +++ b/internal/eventloop.go @@ -24,6 +24,7 @@ type eventLoop struct { comms map[uint32]string // Program or thread name of the current Tid. prevPairs map[uint32]*event.Pair // Previous event (to calculate time differences between two events) tree tree.Tree // Storing all paths in a tree structure for analysis + done chan struct{} // Statistics numTracepoints uint @@ -36,6 +37,7 @@ type eventLoop struct { func newEventLoop(flags flags.Flags) *eventLoop { return &eventLoop{ flags: flags, + done: make(chan struct{}), filter: newEventFilter(flags), enterEvs: make(map[uint32]*event.Pair), files: make(map[int32]file.File), @@ -58,24 +60,39 @@ func (e *eventLoop) stats() string { e.numSyscallsAfterFilter, float64(e.numSyscallsAfterFilter)/duration.Seconds()) } +func (e *eventLoop) stop() { + close(e.done) + if e.flags.TreeEnable { + fmt.Println("Waiting for tree to finish") + <-e.tree.Finished + } +} + func (e *eventLoop) run(rawCh <-chan []byte) { - e.startTime = time.Now() + var recycle bool + + if e.flags.TreeEnable { + e.tree.Start() + } if e.flags.PprofEnable { fmt.Println("Profiling, press Ctrl+C to stop") fmt.Println(event.EventStreamHeader) } + + e.startTime = time.Now() for ev := range e.events(rawCh) { switch { case e.flags.TreeEnable: - // e.tree.Add(ev) + e.tree.Add(ev) + recycle = false // tree needs to recycle by itself case e.flags.PprofEnable: + recycle = true default: + recycle = true fmt.Println(ev.String()) } - if ev.PrevPair != nil { - // Only recycle the previous event, as the current event is the previous event of the next event! - ev.PrevPair.Recycle() - continue + if recycle { + ev.RecyclePrev() } e.numSyscallsAfterFilter++ } @@ -87,6 +104,12 @@ func (e *eventLoop) events(rawCh <-chan []byte) <-chan *event.Pair { go func() { defer close(ch) for raw := range rawCh { + select { + case <-e.done: + return + default: + } + e.numTracepoints++ switch EventType(raw[0]) { case ENTER_OPEN_EVENT: |
