From 40455b5d07b94320ec953a906f861bd9d6a367f4 Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Wed, 11 May 2022 23:10:11 +0900 Subject: [PATCH 1/1] Delete YGNode only root of Flex::Node YGNode remove the memory recursively internally. If we delete childe node's YGNode, it become double free. This patch make Flex::Node free only it's own YGNode. Change-Id: I1f68552ee79d1aa6a503ae67f1b3c1d45c77985b Signed-off-by: Eunki, Hong --- .../src/dali-toolkit/utc-Dali-FlexNode.cpp | 26 ++++++++++++++++++++++ dali-toolkit/devel-api/layouting/flex-node.cpp | 7 ++++-- dali-toolkit/devel-api/layouting/flex-node.h | 3 +-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-FlexNode.cpp b/automated-tests/src/dali-toolkit/utc-Dali-FlexNode.cpp index 4cfdd91..6cef66a 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-FlexNode.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-FlexNode.cpp @@ -90,6 +90,8 @@ int UtcDaliToolkitFlexNodeAddChildWithMarginP(void) DALI_TEST_EQUALS(actorFrame, Vector4(5.0f, 5.0f, ITEM_SIZE.width + 5, ITEM_SIZE.height + 5), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -125,6 +127,8 @@ int UtcDaliToolkitFlexNodeAddChildrenRowP(void) DALI_TEST_EQUALS(actor1Frame, Vector4(0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height), TEST_LOCATION); DALI_TEST_EQUALS(actor2Frame, Vector4(ITEM_SIZE.width, 0.0f, ITEM_SIZE.width * 2, ITEM_SIZE.height), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -161,6 +165,8 @@ int UtcDaliToolkitFlexNodeAddChildrenColumnP(void) DALI_TEST_EQUALS(actor1Frame, Vector4(0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height), TEST_LOCATION); DALI_TEST_EQUALS(actor2Frame, Vector4(0.0f, ITEM_SIZE.height, ITEM_SIZE.width, ITEM_SIZE.height * 2), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -282,6 +288,8 @@ int UtcDaliToolkitFlexNodeAddChildrenColumnJustify(void) DALI_TEST_EQUALS(actor2Frame, Vector4(root.z - ITEM_SIZE.width, root.w - (ITEM_SIZE.height * 2), root.z, root.w - ITEM_SIZE.height), TEST_LOCATION); DALI_TEST_EQUALS(actor3Frame, Vector4(root.z - ITEM_SIZE.width, root.w - ITEM_SIZE.height, root.z, root.w), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -306,6 +314,8 @@ int UtcDaliToolkitFlexNodeSizingP(void) DALI_TEST_EQUALS(flexNode->GetFlexWidth(), 480.0f, TEST_LOCATION); DALI_TEST_EQUALS(flexNode->GetFlexHeight(), 800.0f, TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -399,6 +409,8 @@ int UtcDaliToolkitFlexNodeWrapModeP(void) DALI_TEST_EQUALS(actor3Frame, Vector4(ITEM_SIZE.width * 2, 0.0f, ITEM_SIZE.width * 3, ITEM_SIZE.height), TEST_LOCATION); DALI_TEST_EQUALS(actor4Frame, Vector4(0.0, ITEM_SIZE.height, ITEM_SIZE.width, ITEM_SIZE.height * 2), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -442,6 +454,8 @@ int UtcDaliToolkitFlexNodeRemoveChildP(void) DALI_TEST_EQUALS(actor2Frame, Vector4(0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -486,6 +500,8 @@ int UtcDaliToolkitFlexNodeRemoveAllChildrenP(void) DALI_TEST_NOT_EQUALS(actor1Frame, actor1FrameRemoved, 0.1, TEST_LOCATION); DALI_TEST_NOT_EQUALS(actor2Frame, actor2FrameRemoved, 0.1, TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -528,6 +544,8 @@ int UtcDaliToolkitFlexNodePaddingMarginP(void) DALI_TEST_EQUALS(actor1Frame, Vector4(5.0f, 5.0f, ITEM_SIZE.width + 5, ITEM_SIZE.height + 5), TEST_LOCATION); DALI_TEST_EQUALS(actor2Frame, Vector4(5 + ITEM_SIZE.width, 5.0f, (ITEM_SIZE.width * 2) + 5, ITEM_SIZE.height + 5), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -567,6 +585,8 @@ int UtcDaliToolkitFlexNodeCallbackTestP(void) DALI_TEST_EQUALS(actor1Frame, Vector4(0.0f, 0.0f, ITEM_SIZE_CALLBACK_TEST.width, ITEM_SIZE_CALLBACK_TEST.height), TEST_LOCATION); DALI_TEST_EQUALS(actor2Frame, Vector4(0.0f, ITEM_SIZE_CALLBACK_TEST.height, ITEM_SIZE.width, ITEM_SIZE_CALLBACK_TEST.height + ITEM_SIZE.height), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -642,6 +662,8 @@ int UtcDaliToolkitFlexNodeFlexPositionType(void) DALI_TEST_EQUALS(actor1Frame, Vector4(0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height), TEST_LOCATION); DALI_TEST_EQUALS(actor2Frame, Vector4(0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -710,6 +732,8 @@ int UtcDaliToolkitFlexNodeFlexAspectRatio(void) DALI_TEST_EQUALS(actor1Frame, Vector4(0.0f, 0.0f, ITEM_SIZE.width * 2, ITEM_SIZE.height), TEST_LOCATION); + delete flexNode; + END_TEST; } @@ -803,5 +827,7 @@ int UtcDaliToolkitFlexNodeFlexBasisShrinkGrow(void) DALI_TEST_EQUALS(actor2Frame, Vector4(basis, 0.0f, basis + (root.z - basis) / 2, ITEM_SIZE.height), TEST_LOCATION); DALI_TEST_EQUALS(actor3Frame, Vector4(basis + (root.z - basis) / 2, 0.0f, root.z, ITEM_SIZE.height), TEST_LOCATION); + delete flexNode; + END_TEST; } diff --git a/dali-toolkit/devel-api/layouting/flex-node.cpp b/dali-toolkit/devel-api/layouting/flex-node.cpp index c3636dc..8a7dae6 100644 --- a/dali-toolkit/devel-api/layouting/flex-node.cpp +++ b/dali-toolkit/devel-api/layouting/flex-node.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -93,9 +93,12 @@ Node::Node() Node::~Node() { DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Destructor() >> \n"); + // Destruct child Flex::Node first + mImpl->mChildNodes.clear(); + if(mImpl->mYogaNode) { - YGNodeFreeRecursive(mImpl->mYogaNode); + YGNodeFree(mImpl->mYogaNode); mImpl->mYogaNode = nullptr; } DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Destructor() <<\n"); diff --git a/dali-toolkit/devel-api/layouting/flex-node.h b/dali-toolkit/devel-api/layouting/flex-node.h index a7349fe..44ddfc2 100644 --- a/dali-toolkit/devel-api/layouting/flex-node.h +++ b/dali-toolkit/devel-api/layouting/flex-node.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_LAYOUTING_FLEX_NODE_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -340,7 +340,6 @@ public: private: struct Impl; std::unique_ptr mImpl; - }; // Node } // namespace Flex -- 2.7.4