From 8f6249c12f717fb5780084a98f4e70c16a2ee3a8 Mon Sep 17 00:00:00 2001 From: Basil Milanich Date: Mon, 13 Apr 2026 09:47:52 -0500 Subject: [PATCH] Restore insert_or_assign over operator[] for graphLaunchCache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit operator[] on ConcurrentHashMap returns a reference after releasing the read lock — the subsequent assignment happens with no lock held. This is a latent data race if the map is ever accessed from multiple threads. insert_or_assign performs the lookup and assignment atomically under a single write lock, which is the correct pattern for a ConcurrentHashMap. Co-Authored-By: Claude Opus 4.6 (1M context) --- public/tracy/TracyCUDA.hpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/public/tracy/TracyCUDA.hpp b/public/tracy/TracyCUDA.hpp index d846a240..82b1b440 100644 --- a/public/tracy/TracyCUDA.hpp +++ b/public/tracy/TracyCUDA.hpp @@ -361,6 +361,11 @@ struct ConcurrentHashMap { auto lock = acquire_write_lock(); return mapping.erase(key); } + auto insert_or_assign(TKey key, TValue value) { + ZoneNamed(insert_or_assign, instrument); + auto lock = acquire_write_lock(); + return mapping.insert_or_assign(std::move(key), std::move(value)); + } }; #if TRACY_CUDA_ENABLE_CUDA_CALL_STATS @@ -990,7 +995,7 @@ namespace tracy return false; } } else if (graphId != 0) { - graphLaunchCache[graphId] = apiCallInfo; + graphLaunchCache.insert_or_assign(graphId, apiCallInfo); } return true; }