IVGCVSW-7235 Errors from LoadNetwork are being ignored in ArmNNExecutor.
In ArmNNExecutor::ArmNNExecutor the call to m_Runtime->LoadNetwork was
ignoring the Status result and continuing to execute with a failed
network. In addition throwing an exception from the constructor resulted
in a segmentation fault.
* Modify IExecutor to allow the constructor to mark itself as failed.
* Modify ArmNNExecutor to mark itself as failed when LoadNetwork returns
an error.
* Modify ExecuteNetwork to check the value of m_constructionFailed.
Signed-off-by: Colm Donelan <colm.donelan@arm.com>
Change-Id: Idf222cb2b66e1051875dc67046734f2b00b288d1
diff --git a/tests/ExecuteNetwork/ArmNNExecutor.cpp b/tests/ExecuteNetwork/ArmNNExecutor.cpp
index d1892f9..1e409e8 100644
--- a/tests/ExecuteNetwork/ArmNNExecutor.cpp
+++ b/tests/ExecuteNetwork/ArmNNExecutor.cpp
@@ -28,8 +28,6 @@
m_IOInfo = GetIOInfo(optNet.get());
SetupInputsAndOutputs();
- std::string errorMsg;
-
armnn::ProfilingDetailsMethod profilingDetailsMethod = ProfilingDetailsMethod::Undefined;
if (params.m_OutputDetailsOnlyToStdOut)
{
@@ -46,7 +44,18 @@
params.m_EnableProfiling,
profilingDetailsMethod};
- m_Runtime->LoadNetwork(m_NetworkId, std::move(optNet), errorMsg, networkProperties);
+ std::string errorMsg;
+ Status status = m_Runtime->LoadNetwork(m_NetworkId, std::move(optNet), errorMsg, networkProperties);
+ if (status != Status::Success)
+ {
+ std::string message("Failed to create Arm NN Executor: ");
+ message.append(errorMsg);
+ // Throwing an exception at this point in the constructor causes lots of problems. We'll instead mark this
+ // executor as not constructed.
+ ARMNN_LOG(fatal) << message;
+ m_constructionFailed = true;
+ return;
+ }
if (m_Params.m_Iterations > 1)
{
diff --git a/tests/ExecuteNetwork/ExecuteNetwork.cpp b/tests/ExecuteNetwork/ExecuteNetwork.cpp
index e9ebd0d..c6c8cc0 100644
--- a/tests/ExecuteNetwork/ExecuteNetwork.cpp
+++ b/tests/ExecuteNetwork/ExecuteNetwork.cpp
@@ -55,13 +55,22 @@
}
std::vector<const void*> outputResults;
-
- auto executor = BuildExecutor(programOptions);
- if (!executor)
+ std::unique_ptr<IExecutor> executor;
+ try
{
+ executor = BuildExecutor(programOptions);
+ if (executor->m_constructionFailed)
+ {
+ return EXIT_FAILURE;
+ }
+ }
+ catch (const std::exception& e)
+ {
+ ARMNN_LOG(fatal) << e.what();
return EXIT_FAILURE;
}
+
executor->PrintNetworkInfo();
outputResults = executor->Execute();
diff --git a/tests/ExecuteNetwork/IExecutor.hpp b/tests/ExecuteNetwork/IExecutor.hpp
index 4ed6cbd..21ec904 100644
--- a/tests/ExecuteNetwork/IExecutor.hpp
+++ b/tests/ExecuteNetwork/IExecutor.hpp
@@ -19,4 +19,5 @@
/// Compare the output with the result of another IExecutor
virtual void CompareAndPrintResult(std::vector<const void*> otherOutput) = 0;
virtual ~IExecutor(){};
+ bool m_constructionFailed = false;
};