Fixed bugs in PreCompiledLayer
* Fixed PreCompiledObject type (was const void** instead of void*)
* Fixed bug where a new shared_ptr was being created instead of allowing
std::move to convert the unique_ptr into a shared_ptr.
* Improved tests to ensure that the original pointer is maintained.
Signed-off-by: Mike Kelly <mike.kelly@arm.com>
Change-Id: I3f50d51775ee0180c894c2843ed7bc990a771dea
diff --git a/src/armnn/layers/PreCompiledLayer.cpp b/src/armnn/layers/PreCompiledLayer.cpp
index 0cc9c5a..67c1db4 100644
--- a/src/armnn/layers/PreCompiledLayer.cpp
+++ b/src/armnn/layers/PreCompiledLayer.cpp
@@ -46,7 +46,7 @@
void PreCompiledLayer::SetPreCompiledObject(PreCompiledObjectPtr preCompiledObject)
{
- m_PreCompiledObject = std::make_shared<const void*>(preCompiledObject.release());
+ m_PreCompiledObject = std::move(preCompiledObject);
}
void PreCompiledLayer::Accept(ILayerVisitor& visitor) const
diff --git a/src/armnn/layers/PreCompiledLayer.hpp b/src/armnn/layers/PreCompiledLayer.hpp
index 6a8ac68..0db1472 100644
--- a/src/armnn/layers/PreCompiledLayer.hpp
+++ b/src/armnn/layers/PreCompiledLayer.hpp
@@ -41,7 +41,7 @@
PreCompiledLayer(const PreCompiledLayer& other) = delete;
PreCompiledLayer& operator=(const PreCompiledLayer& other) = delete;
- std::shared_ptr<const void*> m_PreCompiledObject;
+ std::shared_ptr<void> m_PreCompiledObject;
};
} // namespace armnn
diff --git a/src/armnn/test/CloneTests.cpp b/src/armnn/test/CloneTests.cpp
index 2ee2cda..b59e8a4 100644
--- a/src/armnn/test/CloneTests.cpp
+++ b/src/armnn/test/CloneTests.cpp
@@ -25,12 +25,18 @@
return s_Id;
}
+template <typename T>
+void DeleteAsType(const void* const blob)
+{
+ delete static_cast<const T*>(blob);
+}
+
class TestWorkloadFactory : public armnn::WorkloadFactoryBase
{
public:
- TestWorkloadFactory()
- : m_Ptr(nullptr)
+ TestWorkloadFactory(void* ptr)
+ : m_Ptr(ptr)
{}
const armnn::BackendId& GetBackendId() const override
@@ -41,14 +47,7 @@
std::unique_ptr<armnn::IWorkload> CreatePreCompiled(const armnn::PreCompiledQueueDescriptor& descriptor,
const armnn::WorkloadInfo&) const override
{
- if (m_Ptr)
- {
- CHECK(descriptor.m_PreCompiledObject == m_Ptr);
- }
- else
- {
- m_Ptr = descriptor.m_PreCompiledObject;
- }
+ CHECK(descriptor.m_PreCompiledObject == m_Ptr);
return nullptr;
}
@@ -67,9 +66,10 @@
armnn::Layer* const preCompiledLayer = graph1.AddLayer<armnn::PreCompiledLayer>(descriptor, "preCompiled");
armnn::PreCompiledLayer* layer = armnn::PolymorphicDowncast<armnn::PreCompiledLayer*>(preCompiledLayer);
+ std::unique_ptr<std::string> payload = std::make_unique<std::string>("Hello");
- armnn::PreCompiledObjectPtr payloadObject;
- TestWorkloadFactory factory;
+ armnn::PreCompiledObjectPtr payloadObject(payload.release(), DeleteAsType<std::string>);
+ TestWorkloadFactory factory(payloadObject.get());
layer->SetPreCompiledObject(std::move(payloadObject));
layer->CreateWorkload(factory);
@@ -90,7 +90,7 @@
armnn::Layer* const preCompiledLayer = graph1.AddLayer<armnn::PreCompiledLayer>(descriptor, "preCompiled");
armnn::PreCompiledLayer* layer = armnn::PolymorphicDowncast<armnn::PreCompiledLayer*>(preCompiledLayer);
- TestWorkloadFactory factory;
+ TestWorkloadFactory factory(nullptr);
layer->CreateWorkload(factory);
armnn::PreCompiledLayer* clone = layer->Clone(graph2);