From 0cbf33424a4034bc18c433cb6bf8fd72544a05b4 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 19 Mar 2025 22:25:13 +0200 Subject: fix deadlock when exiting of ior doesn't work when there are no events --- internal/eventloop.go | 70 ++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 31 deletions(-) (limited to 'internal/eventloop.go') 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 { -- cgit v1.2.3