aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFinn Williams <Finn.Williams@arm.com>2020-04-16 16:57:59 +0100
committerFinn Williams <Finn.Williams@arm.com>2020-04-16 17:15:24 +0100
commit38939ffbdf2ddffd4e7d4a283796c5cbab14e804 (patch)
tree38ba2f2a0aaf5c9a8809408933d09a195ed22d4c
parentd9ba1a7970157464e857319a46f5ade568635121 (diff)
downloadarmnn-38939ffbdf2ddffd4e7d4a283796c5cbab14e804.tar.gz
IVGCVSW-4701 Make the GUIDGenerator thread safe
Signed-off-by: Finn Williams <Finn.Williams@arm.com> Change-Id: Ide55731c51a8b77d71bfa4f3f7f0d122bb643d87
-rw-r--r--src/profiling/ProfilingGuidGenerator.hpp5
-rw-r--r--src/profiling/test/ProfilingGuidTest.cpp25
2 files changed, 29 insertions, 1 deletions
diff --git a/src/profiling/ProfilingGuidGenerator.hpp b/src/profiling/ProfilingGuidGenerator.hpp
index a31903585c..dc6e22b10a 100644
--- a/src/profiling/ProfilingGuidGenerator.hpp
+++ b/src/profiling/ProfilingGuidGenerator.hpp
@@ -8,6 +8,7 @@
#include "armnn/profiling/IProfilingGuidGenerator.hpp"
#include <functional>
+#include <mutex>
namespace armnn
{
@@ -24,6 +25,7 @@ public:
/// Return the next random Guid in the sequence
inline ProfilingDynamicGuid NextGuid() override
{
+ std::lock_guard<std::mutex> sequencelock(m_SequenceMutex);
ProfilingDynamicGuid guid(m_Sequence);
m_Sequence++;
if (m_Sequence >= MIN_STATIC_GUID)
@@ -42,8 +44,9 @@ public:
}
private:
- uint64_t m_Sequence;
std::hash<std::string> m_Hash;
+ uint64_t m_Sequence;
+ std::mutex m_SequenceMutex;
};
} // namespace profiling
diff --git a/src/profiling/test/ProfilingGuidTest.cpp b/src/profiling/test/ProfilingGuidTest.cpp
index 5782d21cf8..b8f6b88479 100644
--- a/src/profiling/test/ProfilingGuidTest.cpp
+++ b/src/profiling/test/ProfilingGuidTest.cpp
@@ -12,6 +12,7 @@
#include <boost/test/unit_test.hpp>
#include <boost/format.hpp>
+#include <thread>
using namespace armnn::profiling;
@@ -124,4 +125,28 @@ BOOST_AUTO_TEST_CASE(DynamicGuidGeneratorTest)
}
}
+BOOST_AUTO_TEST_CASE (ProfilingGuidThreadTest)
+{
+ ProfilingGuidGenerator profilingGuidGenerator;
+
+ auto guidGenerator = [&profilingGuidGenerator]()
+ {
+ for (int i = 0; i < 1000; ++i)
+ {
+ profilingGuidGenerator.NextGuid();
+ }
+ };
+
+ std::thread t1(guidGenerator);
+ std::thread t2(guidGenerator);
+ std::thread t3(guidGenerator);
+
+ t1.join();
+ t2.join();
+ t3.join();
+
+ uint64_t guid = profilingGuidGenerator.NextGuid();
+ BOOST_CHECK(guid == 3000u);
+}
+
BOOST_AUTO_TEST_SUITE_END()