From 4f7df4a915547234c1f2b574da45c665b92e90b7 Mon Sep 17 00:00:00 2001 From: Kamil Rakoczy Date: Fri, 16 Dec 2022 16:14:02 +0100 Subject: [PATCH] Internals: Mark more VL_MT_SAFE functions (#3816). --- include/verilated.cpp | 50 ++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/include/verilated.cpp b/include/verilated.cpp index acdc31a35..334e95d08 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -1083,7 +1083,8 @@ static void _vl_vsss_read_str(FILE* fp, int& floc, const WDataInP fromp, const s // VL_DBG_MSGF(" _read got='"< pair(cb, datap); - cbs.remove(pair); // Just in case it's a duplicate - cbs.push_back(pair); + VlCbStatic.s_flushCbs.remove(pair); // Just in case it's a duplicate + VlCbStatic.s_flushCbs.push_back(pair); } -static void removeCb(Verilated::VoidPCb cb, void* datap, VoidPCbList& cbs) VL_MT_UNSAFE { +static void addCbExit(Verilated::VoidPCb cb, void* datap) + VL_MT_SAFE_EXCLUDES(VlCbStatic.s_exitMutex) { + const VerilatedLockGuard lock{VlCbStatic.s_exitMutex}; std::pair pair(cb, datap); - cbs.remove(pair); + VlCbStatic.s_exitCbs.remove(pair); // Just in case it's a duplicate + VlCbStatic.s_exitCbs.push_back(pair); +} +static void removeCbFlush(Verilated::VoidPCb cb, void* datap) + VL_MT_SAFE_EXCLUDES(VlCbStatic.s_flushMutex) { + const VerilatedLockGuard lock{VlCbStatic.s_flushMutex}; + std::pair pair(cb, datap); + VlCbStatic.s_flushCbs.remove(pair); +} +static void removeCbExit(Verilated::VoidPCb cb, void* datap) + VL_MT_SAFE_EXCLUDES(VlCbStatic.s_exitMutex) { + const VerilatedLockGuard lock{VlCbStatic.s_exitMutex}; + std::pair pair(cb, datap); + VlCbStatic.s_exitCbs.remove(pair); } static void runCallbacks(const VoidPCbList& cbs) VL_MT_SAFE { for (const auto& i : cbs) i.first(i.second); } -void Verilated::addFlushCb(VoidPCb cb, void* datap) VL_MT_SAFE { - const VerilatedLockGuard lock{VlCbStatic.s_flushMutex}; - addCb(cb, datap, VlCbStatic.s_flushCbs); -} -void Verilated::removeFlushCb(VoidPCb cb, void* datap) VL_MT_SAFE { - const VerilatedLockGuard lock{VlCbStatic.s_flushMutex}; - removeCb(cb, datap, VlCbStatic.s_flushCbs); -} +void Verilated::addFlushCb(VoidPCb cb, void* datap) VL_MT_SAFE { addCbFlush(cb, datap); } +void Verilated::removeFlushCb(VoidPCb cb, void* datap) VL_MT_SAFE { removeCbFlush(cb, datap); } void Verilated::runFlushCallbacks() VL_MT_SAFE { // Flush routines may call flush, so avoid mutex deadlock static std::atomic s_recursing; @@ -2827,14 +2839,8 @@ void Verilated::runFlushCallbacks() VL_MT_SAFE { VL_GCOV_DUMP(); } -void Verilated::addExitCb(VoidPCb cb, void* datap) VL_MT_SAFE { - const VerilatedLockGuard lock{VlCbStatic.s_exitMutex}; - addCb(cb, datap, VlCbStatic.s_exitCbs); -} -void Verilated::removeExitCb(VoidPCb cb, void* datap) VL_MT_SAFE { - const VerilatedLockGuard lock{VlCbStatic.s_exitMutex}; - removeCb(cb, datap, VlCbStatic.s_exitCbs); -} +void Verilated::addExitCb(VoidPCb cb, void* datap) VL_MT_SAFE { addCbExit(cb, datap); } +void Verilated::removeExitCb(VoidPCb cb, void* datap) VL_MT_SAFE { removeCbExit(cb, datap); } void Verilated::runExitCallbacks() VL_MT_SAFE { static std::atomic s_recursing; if (!s_recursing++) {