summaryrefslogtreecommitdiff
path: root/internal/eventloop.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-03-19 22:25:13 +0200
committerPaul Buetow <paul@buetow.org>2025-03-19 22:25:13 +0200
commit0cbf33424a4034bc18c433cb6bf8fd72544a05b4 (patch)
tree3834229aa0a1ff483114105fc8f2478379fdf42c /internal/eventloop.go
parent155f630a61e353b623837c5403e0a85b8792d671 (diff)
fix deadlock when exiting of ior doesn't work when there are no events
Diffstat (limited to 'internal/eventloop.go')
-rw-r--r--internal/eventloop.go70
1 files changed, 39 insertions, 31 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go
index ff00671..497522f 100644
--- a/internal/eventloop.go
+++ b/internal/eventloop.go
@@ -47,8 +47,8 @@ func newEventLoop(flags flags.Flags) *eventLoop {
}
}
-// TODO: Could use the table from the gos project to display the stats here
func (e *eventLoop) stats() string {
+ fmt.Println("Waiting for staps to be ready")
<-e.done
duration := time.Since(e.startTime)
@@ -101,39 +101,17 @@ func (e *eventLoop) events(ctx context.Context, rawCh <-chan []byte) <-chan *eve
go func() {
defer close(ch)
- for raw := range rawCh {
+ for {
select {
- case <-ctx.Done():
- return
+ case raw := <-rawCh:
+ e.processRawEvent(raw, ch)
default:
- }
-
- e.numTracepoints++
- switch EventType(raw[0]) {
- case ENTER_OPEN_EVENT:
- if ev, ok := e.filter.openEvent(NewOpenEvent(raw)); ok {
- e.syscallEnter(ev)
- }
- case EXIT_OPEN_EVENT:
- e.syscallExit(NewFdEvent(raw), ch)
- case ENTER_FD_EVENT:
- e.syscallEnter(NewFdEvent(raw))
- case EXIT_FD_EVENT:
- e.syscallExit(NewFdEvent(raw), ch)
- case EXIT_NULL_EVENT:
- e.syscallExit(NewNullEvent(raw), ch)
- case EXIT_RET_EVENT:
- e.syscallExit(NewRetEvent(raw), ch)
- case ENTER_NAME_EVENT:
- if ev, ok := e.filter.nameEvent(NewNameEvent(raw)); ok {
- e.syscallEnter(ev)
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ time.Sleep(time.Millisecond * 10)
}
- case ENTER_PATH_EVENT:
- if ev, ok := e.filter.pathEvent(NewPathEvent(raw)); ok {
- e.syscallEnter(ev)
- }
- default:
- panic(fmt.Sprintf("unhandled event type %v: %v", EventType(raw[0]), raw))
}
}
}()
@@ -141,6 +119,36 @@ func (e *eventLoop) events(ctx context.Context, rawCh <-chan []byte) <-chan *eve
return ch
}
+func (e *eventLoop) processRawEvent(raw []byte, ch chan *event.Pair) {
+ e.numTracepoints++
+ switch EventType(raw[0]) {
+ case ENTER_OPEN_EVENT:
+ if ev, ok := e.filter.openEvent(NewOpenEvent(raw)); ok {
+ e.syscallEnter(ev)
+ }
+ case EXIT_OPEN_EVENT:
+ e.syscallExit(NewFdEvent(raw), ch)
+ case ENTER_FD_EVENT:
+ e.syscallEnter(NewFdEvent(raw))
+ case EXIT_FD_EVENT:
+ e.syscallExit(NewFdEvent(raw), ch)
+ case EXIT_NULL_EVENT:
+ e.syscallExit(NewNullEvent(raw), ch)
+ case EXIT_RET_EVENT:
+ e.syscallExit(NewRetEvent(raw), ch)
+ case ENTER_NAME_EVENT:
+ if ev, ok := e.filter.nameEvent(NewNameEvent(raw)); ok {
+ e.syscallEnter(ev)
+ }
+ case ENTER_PATH_EVENT:
+ if ev, ok := e.filter.pathEvent(NewPathEvent(raw)); ok {
+ e.syscallEnter(ev)
+ }
+ default:
+ panic(fmt.Sprintf("unhandled event type %v: %v", EventType(raw[0]), raw))
+ }
+}
+
func (e *eventLoop) syscallEnter(enterEv event.Event) {
tid := enterEv.GetTid()
if !e.filter.commFilterEnable {