From 31e6acb949293d53ca61a6358ad886433092fe3c Mon Sep 17 00:00:00 2001 From: Rebecca Pelke Date: Mon, 27 Jul 2020 18:14:51 +0200 Subject: [PATCH] umd: sync taskQueue operations in Emulator using condition variables --- umd/core/src/runtime/Emulator.cpp | 44 +++++++++++--------- umd/core/src/runtime/include/priv/Emulator.h | 5 +++ 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/umd/core/src/runtime/Emulator.cpp b/umd/core/src/runtime/Emulator.cpp index 6121c13d..e94f2b0a 100644 --- a/umd/core/src/runtime/Emulator.cpp +++ b/umd/core/src/runtime/Emulator.cpp @@ -60,13 +60,16 @@ bool Emulator::ping() NvDlaError Emulator::submit(NvU8* task_mem, bool blocking) { - m_taskQueue.push(task_mem); + { + std::lock_guard lk(m_mtx); + m_taskQueue.push(task_mem); + } + m_cv.notify_all(); if (blocking) { - // wait until queue becomes empty - while (!m_taskQueue.empty()) { - NvDlaThreadYield(); - } + // wait until queue becomes empty + std::unique_lock lk(m_mtx); + m_cv.wait(lk, [&]{return !(!m_taskQueue.empty() || m_signalShutdown);}); } return NvDlaSuccess; @@ -97,6 +100,7 @@ bool Emulator::stop() if (m_thread) { m_signalShutdown = true; + m_cv.notify_all(); NvDlaThreadJoin(m_thread); m_thread = NULL; } @@ -115,7 +119,14 @@ bool Emulator::run() while (true) { - if (!m_taskQueue.empty()) + std::unique_lock lk(m_mtx); + m_cv.wait(lk, [&]{return (!m_taskQueue.empty() || m_signalShutdown);}); + + if (m_signalShutdown) + { + break; + } + else if (!m_taskQueue.empty()) { NvU8* task_mem = m_taskQueue.front(); NvDlaDebugPrintf("Work Found!\n"); @@ -145,25 +156,18 @@ bool Emulator::run() NvDlaDebugPrintf("Work Done\n"); m_taskQueue.pop(); - continue; - } - - if (m_signalShutdown) - { - NvDlaDebugPrintf("Shutdown signal received, exiting\n"); - break; + m_cv.notify_one(); } + } - if (m_taskQueue.empty()) - { - NvDlaSleepMS(500); - } - } // Cleanup - while (!m_taskQueue.empty()) { - m_taskQueue.pop(); + std::lock_guard lk(m_mtx); + while (!m_taskQueue.empty()) + { + m_taskQueue.pop(); + } } delete emu_if; diff --git a/umd/core/src/runtime/include/priv/Emulator.h b/umd/core/src/runtime/include/priv/Emulator.h index c21d9f13..8e137c85 100644 --- a/umd/core/src/runtime/include/priv/Emulator.h +++ b/umd/core/src/runtime/include/priv/Emulator.h @@ -30,6 +30,8 @@ #define NVDLA_PRIV_EMULATOR_H #include +#include +#include #include "priv/EMUInterface.h" @@ -78,6 +80,9 @@ class Emulator bool m_threadActive; bool m_signalShutdown; + + std::mutex m_mtx; + std::condition_variable m_cv; }; } // nvdla::priv