From 4010734b6b4ec9e26532c068adfbb8d24d92ab77 Mon Sep 17 00:00:00 2001 From: Rafal Walczyna Date: Wed, 20 Jan 2021 12:49:15 +0100 Subject: [PATCH] [ML][Common] Add support for creating TensorsInfo from native handle ACR: TWDAPI-273 Some of the ml native functions require not initialized handle. TensorsInfo::CreateTensorsInfo() uses ml_tensors_info_create which allocates memory for tensors info - but i.e. ml_single_get_input_info allocates memory again without freeing old handle. [Verification] Builts successfully, TensorsInfo.count tested in Chrome dev console. Change-Id: I6b2e9c60dbed23a2d1962e68cc9408a8faecb383 Signed-off-by: Rafal Walczyna --- src/ml/ml_tensors_info_manager.cc | 23 +++++++++++++++++++++-- src/ml/ml_tensors_info_manager.h | 2 ++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/ml/ml_tensors_info_manager.cc b/src/ml/ml_tensors_info_manager.cc index 33af06f..8947aa6 100644 --- a/src/ml/ml_tensors_info_manager.cc +++ b/src/ml/ml_tensors_info_manager.cc @@ -24,7 +24,7 @@ using common::PlatformResult; namespace extension { namespace ml { -TensorsInfo::TensorsInfo(ml_tensors_info_h handle, int id) : handle_(handle), id_(id), count_(0) { +TensorsInfo::TensorsInfo(ml_tensors_info_h handle, int id) : handle_(handle), id_(id), count_(-1) { ScopeLogger(); } @@ -42,6 +42,15 @@ int TensorsInfo::Id() { } int TensorsInfo::Count() { + if (-1 == count_) { + LoggerD("Lazy initialization of count_ property."); + unsigned int c; + if (NativeGetCount(&c)) { + count_ = c; + } else { + LoggerE("Could not fetch TensorsInfo count from native layer"); + } + } return this->count_; } @@ -98,7 +107,6 @@ std::shared_ptr TensorsInfo::CreateClone(int cloneId) { return nullptr; } auto t = std::make_shared(clone_h, cloneId); - t->count_ = this->Count(); return t; } @@ -301,6 +309,17 @@ TensorsInfo* TensorsInfoManager::CreateTensorsInfo() { return t.get(); }; +TensorsInfo* TensorsInfoManager::CreateTensorsInfo(ml_tensors_info_h handle) { + ScopeLogger(); + + int id = nextId_++; + auto t = std::make_shared(handle, id); + map_by_id_[id] = t; + map_by_handle_[handle] = t; + + return t.get(); +}; + TensorsInfo* TensorsInfoManager::CloneTensorsInfo(TensorsInfo* src) { ScopeLogger(); if (nullptr == src) { diff --git a/src/ml/ml_tensors_info_manager.h b/src/ml/ml_tensors_info_manager.h index d1d8b3c..6320216 100644 --- a/src/ml/ml_tensors_info_manager.h +++ b/src/ml/ml_tensors_info_manager.h @@ -69,6 +69,8 @@ class TensorsInfoManager { TensorsInfoManager(); ~TensorsInfoManager(); TensorsInfo* CreateTensorsInfo(); + // handle will be destroyed on TensorsInfo object destruction + TensorsInfo* CreateTensorsInfo(ml_tensors_info_h handle); TensorsInfo* CloneTensorsInfo(TensorsInfo* src); TensorsInfo* GetTensorsInfo(int id); -- 2.7.4