From: Inki Dae Date: Fri, 17 May 2024 04:00:12 +0000 (+0900) Subject: task_manager: drop arguments from callback for CallbackNode X-Git-Tag: accepted/tizen/unified/20240903.110722~46 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9b0c817ab9ad7bbbe1c24f1488ce0ef96f9e8fc1;p=platform%2Fcore%2Fapi%2Fsingleo.git task_manager: drop arguments from callback for CallbackNode Drop unnecessary arguments from callback for CallbackNode. Now CallbackNode can act like normal node such as InferenceNode so drop the unnecessary arguments and get them(input and result) from CallbackNode itself. This patch is a step for separating CallbackNode into two nodes - BridgeNode and EndpointNode - as I shared already, which will drop the code smell that CallbackNode has two kinds of behaviors. Change-Id: I25bbc87a1f1d9a82e5c7340b39b8d789599db933 Signed-off-by: Inki Dae --- diff --git a/services/task_manager/include/CallbackNode.h b/services/task_manager/include/CallbackNode.h index 6fff52a..f36fe11 100644 --- a/services/task_manager/include/CallbackNode.h +++ b/services/task_manager/include/CallbackNode.h @@ -56,10 +56,7 @@ public: { return _name; } - void addInput(std::shared_ptr input) - { - throw exception::InvalidOperation("Not supported."); - } + void addInput(std::shared_ptr input) override; std::vector > &getInputs() override; void addDependency(std::shared_ptr node) override; std::vector > &getDependencies() override; @@ -72,7 +69,7 @@ public: NodeCb getCb(); void setUserData(void *user_data); void *getUserData(); - std::vector > &getResult(); + std::vector > &getResults(); void addResult(std::shared_ptr result); }; diff --git a/services/task_manager/include/INode.h b/services/task_manager/include/INode.h index 366a0cd..4b371a5 100644 --- a/services/task_manager/include/INode.h +++ b/services/task_manager/include/INode.h @@ -30,8 +30,7 @@ namespace services { enum class NodeType { NONE, INFERENCE, CB }; -using NodeCb = std::function &results, std::shared_ptr input, - void *user_data)>; +using NodeCb = std::function; class INode { diff --git a/services/task_manager/src/CallbackNode.cpp b/services/task_manager/src/CallbackNode.cpp index 95d1312..58a69fa 100644 --- a/services/task_manager/src/CallbackNode.cpp +++ b/services/task_manager/src/CallbackNode.cpp @@ -28,6 +28,11 @@ NodeType CallbackNode::getType() return _type; } +void CallbackNode::addInput(shared_ptr input) +{ + _inputs.push_back(input); +} + vector > &CallbackNode::getInputs() { return _inputs; @@ -79,7 +84,7 @@ void CallbackNode::addResult(std::shared_ptr result) _results.push_back(result); } -vector > &CallbackNode::getResult() +vector > &CallbackNode::getResults() { return _results; } diff --git a/services/task_manager/src/TaskManager.cpp b/services/task_manager/src/TaskManager.cpp index 1ff4a1a..7400c95 100644 --- a/services/task_manager/src/TaskManager.cpp +++ b/services/task_manager/src/TaskManager.cpp @@ -78,20 +78,31 @@ void TaskManager::threadCb(shared_ptr &node) throw InvalidOperation("Callback function or user data is null."); } - vector results; - for (auto &n : node->getDependencies()) { // Add the result if dependency node is inference service not callback. if (n->getType() == NodeType::INFERENCE) { auto inferenceNode = dynamic_pointer_cast(n); - results.push_back(&inferenceNode->getInferenceTask()->result()); + auto &result = inferenceNode->getInferenceTask()->result(); + + if (result._type == ResultType::FACE_DETECTION) + callbackNode->addResult(make_shared( + dynamic_cast(inferenceNode->getInferenceTask()->result()))); + else if (result._type == ResultType::FACE_LANDMARK) + callbackNode->addResult(make_shared( + dynamic_cast(inferenceNode->getInferenceTask()->result()))); + else if (result._type == ResultType::OBJECT_DETECTION) + callbackNode->addResult(make_shared( + dynamic_cast(inferenceNode->getInferenceTask()->result()))); } } + // TODO. consider for mulitple inputs later. + node->addInput(_inputs[0]); + // Call the callback function registered in this callback node. // In this callback, new data should be set by calling node->setOutput() // if new data is made. TODO. consider for multiple inputs later. - cb(results, _inputs[0], user_data); + cb(user_data); } // Wake up. @@ -189,7 +200,7 @@ vector > &TaskManager::output() } else { auto callbackNode = dynamic_pointer_cast(lastNode); - _results = callbackNode->getResult(); + _results = callbackNode->getResults(); } return _results; diff --git a/test/services/test_task_manager.cpp b/test/services/test_task_manager.cpp index e4f221e..939eabc 100644 --- a/test/services/test_task_manager.cpp +++ b/test/services/test_task_manager.cpp @@ -34,11 +34,11 @@ using namespace singleo; using namespace singleo::inference; using namespace singleo::services; -void BridgeNodeCallback(vector &results, shared_ptr inputData, void *user_data) +void BridgeNodeCallback(void *user_data) { - shared_ptr imageData = dynamic_pointer_cast(inputData); - size_t buffer_size = imageData->width * imageData->height * imageData->byte_per_pixel; CallbackNode *node = static_cast(user_data); + shared_ptr imageData = dynamic_pointer_cast(node->getInputs()[0]); + size_t buffer_size = imageData->width * imageData->height * imageData->byte_per_pixel; ImageDataType newImage; newImage = *imageData; @@ -49,13 +49,15 @@ void BridgeNodeCallback(vector &results, shared_ptrgetResults(); for (auto r : results) { if (r->_type != ResultType::FACE_DETECTION) { cout << "invalid result type" << endl; continue; } - FdResultType *f_r = dynamic_cast(r); + auto f_r = dynamic_pointer_cast(r); for (auto rect : f_r->_rects) cout << rect.left << " x " << rect.top << " ~ " << rect.right << " x " << rect.bottom << endl; @@ -188,21 +190,16 @@ TEST(SingloTaskManager, MultipleNodesBasedGraphBShouldWork) } } -void LastNodeCallback(vector &results, shared_ptr inputData, void *user_data) +void LastNodeCallback(void *user_data) { CallbackNode *node = static_cast(user_data); - for (auto &r : results) { - ASSERT_EQ((r->_type == ResultType::FACE_DETECTION || r->_type == ResultType::FACE_LANDMARK), true); + auto &results = node->getResults(); - if (r->_type == ResultType::FACE_DETECTION) { - auto fdResult = dynamic_cast(r); - node->addResult(make_shared(*fdResult)); - } else { - auto fldResult = dynamic_cast(r); - node->addResult(make_shared(*fldResult)); - } - } + cout << "result count = " << results.size() << endl; + + // Nothing to do in case of last node. + // So do anything you want here if you want to do something in last node. } // GraphC: