diff --git a/level_zero/tools/source/debug/linux/prelim/debug_session.cpp b/level_zero/tools/source/debug/linux/prelim/debug_session.cpp index 69ef0bad48..0d32eae312 100644 --- a/level_zero/tools/source/debug/linux/prelim/debug_session.cpp +++ b/level_zero/tools/source/debug/linux/prelim/debug_session.cpp @@ -255,23 +255,29 @@ ze_result_t DebugSessionLinux::initialize() { startInternalEventsThread(); bool allEventsCollected = false; - bool eventAvailable = false; + bool eventAvailable = true; + float timeDelta = 0; + float timeStart = clock(); do { - auto eventMemory = getInternalEvent(); - auto debugEvent = reinterpret_cast(eventMemory.get()); - if (eventMemory != nullptr) { - handleEvent(debugEvent); - if (debugEvent->type != PRELIM_DRM_I915_DEBUG_EVENT_VM_BIND && pendingVmBindEvents.size() > 0) { - processPendingVmBindEvents(); + if (internalThreadHasStarted) { + auto eventMemory = getInternalEvent(); + auto debugEvent = reinterpret_cast(eventMemory.get()); + if (eventMemory != nullptr) { + handleEvent(debugEvent); + if (debugEvent->type != PRELIM_DRM_I915_DEBUG_EVENT_VM_BIND && pendingVmBindEvents.size() > 0) { + processPendingVmBindEvents(); + } + eventAvailable = true; + } else { + eventAvailable = false; } - eventAvailable = true; + allEventsCollected = checkAllEventsCollected(); } else { - eventAvailable = false; + timeDelta = float(clock() - timeStart) / CLOCKS_PER_SEC; } + } while ((eventAvailable && !allEventsCollected) && timeDelta < 0.5); - allEventsCollected = checkAllEventsCollected(); - - } while (eventAvailable && !allEventsCollected); + internalThreadHasStarted = false; if (clientHandleClosed == clientHandle && clientHandle != invalidClientHandle) { return ZE_RESULT_ERROR_DEVICE_LOST; @@ -334,6 +340,7 @@ void *DebugSessionLinux::asyncThreadFunction(void *arg) { void *DebugSessionLinux::readInternalEventsThreadFunction(void *arg) { DebugSessionLinux *self = reinterpret_cast(arg); PRINT_DEBUGGER_INFO_LOG("Debugger internal event thread started\n", ""); + self->internalThreadHasStarted = true; while (self->internalEventThread.threadActive) { self->readInternalEventsAsync(); diff --git a/level_zero/tools/source/debug/linux/prelim/debug_session.h b/level_zero/tools/source/debug/linux/prelim/debug_session.h index 82f0f9b4e8..eaada1168d 100644 --- a/level_zero/tools/source/debug/linux/prelim/debug_session.h +++ b/level_zero/tools/source/debug/linux/prelim/debug_session.h @@ -357,6 +357,7 @@ struct DebugSessionLinux : DebugSessionImp { uint64_t euControlInterruptSeqno[NEO::EngineLimits::maxHandleCount]; std::unordered_map> clientHandleToConnection; + std::atomic internalThreadHasStarted{false}; }; struct TileDebugSessionLinux : DebugSessionLinux { diff --git a/level_zero/tools/test/unit_tests/sources/debug/linux/debug_session_fixtures_linux.h b/level_zero/tools/test/unit_tests/sources/debug/linux/debug_session_fixtures_linux.h index abc02ba89e..9b49b798dc 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/linux/debug_session_fixtures_linux.h +++ b/level_zero/tools/test/unit_tests/sources/debug/linux/debug_session_fixtures_linux.h @@ -400,6 +400,7 @@ struct MockDebugSessionLinux : public L0::DebugSessionLinux { void startInternalEventsThread() override { if (synchronousInternalEventRead) { + internalThreadHasStarted = true; return; } return DebugSessionLinux::startInternalEventsThread();