[Bf-blender-cvs] [d148d2a4477] functions: free memory of inlined node tree

Jacques Lucke noreply at git.blender.org
Tue Nov 26 17:31:43 CET 2019


Commit: d148d2a447755394e005e37a7642a3c89dcf2183
Author: Jacques Lucke
Date:   Tue Nov 26 15:27:27 2019 +0100
Branches: functions
https://developer.blender.org/rBd148d2a447755394e005e37a7642a3c89dcf2183

free memory of inlined node tree

===================================================================

M	source/blender/blenkernel/BKE_inlined_node_tree.h
M	source/blender/blenkernel/intern/inlined_node_tree.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_inlined_node_tree.h b/source/blender/blenkernel/BKE_inlined_node_tree.h
index 5642132c1f7..85ce3ce579a 100644
--- a/source/blender/blenkernel/BKE_inlined_node_tree.h
+++ b/source/blender/blenkernel/BKE_inlined_node_tree.h
@@ -80,6 +80,8 @@ class XNode : BLI::NonCopyable, BLI::NonMovable {
 
   friend InlinedNodeTree;
 
+  void destruct_with_sockets();
+
  public:
   const VNode &vnode() const;
   const XParentNode *parent() const;
@@ -110,19 +112,26 @@ class InlinedNodeTree : BLI::NonCopyable, BLI::NonMovable {
   BLI::MonotonicAllocator<> m_allocator;
   bNodeTree *m_btree;
   Vector<XNode *> m_node_by_id;
+  Vector<XGroupInput *> m_group_inputs;
+  Vector<XParentNode *> m_parent_nodes;
+
   Vector<XSocket *> m_sockets_by_id;
   Vector<XInputSocket *> m_input_sockets;
   Vector<XOutputSocket *> m_output_sockets;
-  Vector<XParentNode *> m_parent_nodes;
 
  public:
   InlinedNodeTree(bNodeTree *btree, BTreeVTreeMap &vtrees);
+  ~InlinedNodeTree();
 
   std::string to_dot() const;
   void to_dot__clipboard() const;
 
  private:
-  void expand_group_node(XNode &group_node, Vector<XNode *> &nodes, BTreeVTreeMap &vtrees);
+  void expand_group_node(XNode &group_node,
+                         Vector<XNode *> &all_nodes,
+                         Vector<XGroupInput *> &all_group_inputs,
+                         Vector<XParentNode *> &all_parent_nodes,
+                         BTreeVTreeMap &vtrees);
   XNode &create_node(const VNode &vnode,
                      XParentNode *parent,
                      Map<const VInputSocket *, XInputSocket *> &inputs_map,
diff --git a/source/blender/blenkernel/intern/inlined_node_tree.cc b/source/blender/blenkernel/intern/inlined_node_tree.cc
index 9c6a6ea22aa..34bb5b6c41a 100644
--- a/source/blender/blenkernel/intern/inlined_node_tree.cc
+++ b/source/blender/blenkernel/intern/inlined_node_tree.cc
@@ -73,12 +73,33 @@ static bool is_group_node(const VNode &vnode)
   return vnode.idname() == "fn_GroupNode";
 }
 
+InlinedNodeTree::~InlinedNodeTree()
+{
+  for (XNode *xnode : m_node_by_id) {
+    xnode->~XNode();
+  }
+  for (XGroupInput *xgroup_input : m_group_inputs) {
+    xgroup_input->~XGroupInput();
+  }
+  for (XParentNode *xparent_node : m_parent_nodes) {
+    xparent_node->~XParentNode();
+  }
+  for (XInputSocket *xsocket : m_input_sockets) {
+    xsocket->~XInputSocket();
+  }
+  for (XOutputSocket *xsocket : m_output_sockets) {
+    xsocket->~XOutputSocket();
+  }
+}
+
 InlinedNodeTree::InlinedNodeTree(bNodeTree *btree, BTreeVTreeMap &vtrees) : m_btree(btree)
 {
   SCOPED_TIMER(__func__);
   const VirtualNodeTree &main_vtree = get_vtree(vtrees, btree);
 
-  Vector<XNode *> nodes;
+  Vector<XNode *> all_nodes;
+  Vector<XGroupInput *> all_group_inputs;
+  Vector<XParentNode *> all_parent_nodes;
 
   Map<const VInputSocket *, XInputSocket *> inputs_map;
   Map<const VOutputSocket *, XOutputSocket *> outputs_map;
@@ -86,7 +107,7 @@ InlinedNodeTree::InlinedNodeTree(bNodeTree *btree, BTreeVTreeMap &vtrees) : m_bt
   /* Insert main nodes. */
   for (const VNode *vnode : main_vtree.nodes()) {
     XNode &node = this->create_node(*vnode, nullptr, inputs_map, outputs_map);
-    nodes.append(&node);
+    all_nodes.append(&node);
   }
 
   /* Insert main links. */
@@ -102,31 +123,59 @@ InlinedNodeTree::InlinedNodeTree(bNodeTree *btree, BTreeVTreeMap &vtrees) : m_bt
   }
 
   /* Expand node groups one after another. */
-  for (uint i = 0; i < nodes.size(); i++) {
-    XNode &current_node = *nodes[i];
+  for (uint i = 0; i < all_nodes.size(); i++) {
+    XNode &current_node = *all_nodes[i];
     if (is_group_node(*current_node.m_vnode)) {
-      this->expand_group_node(current_node, nodes, vtrees);
+      this->expand_group_node(current_node, all_nodes, all_group_inputs, all_parent_nodes, vtrees);
     }
   }
 
   /* Remove unused nodes. */
-  for (int i = 0; i < nodes.size(); i++) {
-    XNode &current_node = *nodes[i];
-    if (is_group_node(*current_node.m_vnode)) {
-      nodes.remove_and_reorder(i);
+  for (int i = 0; i < all_nodes.size(); i++) {
+    XNode *current_node = all_nodes[i];
+    if (is_group_node(current_node->vnode()) ||
+        (is_interface_node(current_node->vnode()) && current_node->parent() != nullptr)) {
+      all_nodes.remove_and_reorder(i);
+      current_node->destruct_with_sockets();
       i--;
     }
-    else if (is_interface_node(*current_node.m_vnode) && current_node.m_parent != nullptr) {
-      nodes.remove_and_reorder(i);
-      i--;
+  }
+
+  /* Store used nodes and sockets in 'this'. */
+  m_node_by_id = std::move(all_nodes);
+  m_group_inputs = std::move(all_group_inputs);
+  m_parent_nodes = std::move(all_parent_nodes);
+
+  for (uint node_index : m_node_by_id.index_iterator()) {
+    XNode *xnode = m_node_by_id[node_index];
+    xnode->m_id = node_index;
+
+    for (XInputSocket *xsocket : xnode->m_inputs) {
+      xsocket->m_id = m_sockets_by_id.append_and_get_index(xsocket);
+      m_input_sockets.append(xsocket);
+    }
+    for (XOutputSocket *xsocket : xnode->m_outputs) {
+      xsocket->m_id = m_sockets_by_id.append_and_get_index(xsocket);
+      m_output_sockets.append(xsocket);
     }
   }
+}
 
-  m_node_by_id = nodes;
+void XNode::destruct_with_sockets()
+{
+  for (XInputSocket *socket : m_inputs) {
+    socket->~XInputSocket();
+  }
+  for (XOutputSocket *socket : m_outputs) {
+    socket->~XOutputSocket();
+  }
+  this->~XNode();
 }
 
 void InlinedNodeTree::expand_group_node(XNode &group_node,
-                                        Vector<XNode *> &nodes,
+                                        Vector<XNode *> &all_nodes,
+                                        Vector<XGroupInput *> &all_group_inputs,
+                                        Vector<XParentNode *> &all_parent_nodes,
                                         BTreeVTreeMap &vtrees)
 {
   BLI_assert(is_group_node(*group_node.m_vnode));
@@ -139,6 +188,7 @@ void InlinedNodeTree::expand_group_node(XNode &group_node,
   const VirtualNodeTree &vtree = get_vtree(vtrees, btree);
 
   XParentNode &sub_parent = *m_allocator.construct<XParentNode>().release();
+  all_parent_nodes.append(&sub_parent);
   sub_parent.m_parent = group_node.m_parent;
   sub_parent.m_vnode = &group_vnode;
 
@@ -148,7 +198,7 @@ void InlinedNodeTree::expand_group_node(XNode &group_node,
   /* Insert nodes of group. */
   for (const VNode *vnode : vtree.nodes()) {
     XNode &node = this->create_node(*vnode, &sub_parent, inputs_map, outputs_map);
-    nodes.append(&node);
+    all_nodes.append(&node);
   }
 
   /* Insert links of group. */
@@ -175,6 +225,7 @@ void InlinedNodeTree::expand_group_node(XNode &group_node,
     if (outside_interface.m_linked_sockets.size() == 0 &&
         outside_interface.m_linked_group_inputs.size() == 0) {
       XGroupInput &group_input_dummy = *m_allocator.construct<XGroupInput>().release();
+      all_group_inputs.append(&group_input_dummy);
       group_input_dummy.m_vsocket = outside_interface.m_vsocket;
       group_input_dummy.m_parent = group_node.m_parent;
 
@@ -182,21 +233,23 @@ void InlinedNodeTree::expand_group_node(XNode &group_node,
       outside_interface.m_linked_group_inputs.append(&group_input_dummy);
     }
 
+    for (XOutputSocket *outside_connected : outside_interface.m_linked_sockets) {
+      outside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(&outside_interface);
+    }
+
+    for (XGroupInput *outside_connected : outside_interface.m_linked_group_inputs) {
+      outside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(&outside_interface);
+    }
+
     for (XInputSocket *inside_connected : inside_interface.m_linked_sockets) {
       inside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(&inside_interface);
 
       for (XOutputSocket *outside_connected : outside_interface.m_linked_sockets) {
-        outside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(
-            &outside_interface);
-
         inside_connected->m_linked_sockets.append(outside_connected);
         outside_connected->m_linked_sockets.append(inside_connected);
       }
 
       for (XGroupInput *outside_connected : outside_interface.m_linked_group_inputs) {
-        outside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(
-            &outside_interface);
-
         inside_connected->m_linked_group_inputs.append(outside_connected);
         outside_connected->m_linked_sockets.append(inside_connected);
       }



More information about the Bf-blender-cvs mailing list