This is an automated email from the ASF dual-hosted git repository.

dmeden pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new fe4fe87e0d txn_box: Use swoc::MemArena instead of manual allocation. 
(#11156)
fe4fe87e0d is described below

commit fe4fe87e0dcc83b3c16b580307ca681c7b514296
Author: Damian Meden <[email protected]>
AuthorDate: Mon Apr 8 18:38:12 2024 +0200

    txn_box: Use swoc::MemArena instead of manual allocation. (#11156)
    
    Beside the benefits of using the arena this change helps to mitigate a leak 
that was found while building with
    ASAN.
---
 .../txn_box/plugin/include/txn_box/accl_util.h     | 63 ++++++++++------------
 1 file changed, 27 insertions(+), 36 deletions(-)

diff --git a/plugins/experimental/txn_box/plugin/include/txn_box/accl_util.h 
b/plugins/experimental/txn_box/plugin/include/txn_box/accl_util.h
index 14c306e2b0..193698fa22 100644
--- a/plugins/experimental/txn_box/plugin/include/txn_box/accl_util.h
+++ b/plugins/experimental/txn_box/plugin/include/txn_box/accl_util.h
@@ -33,6 +33,7 @@
 
 #include <swoc/TextView.h>
 #include <swoc/swoc_meta.h>
+#include <swoc/MemArena.h>
 
 // fwd declarations.
 class Comparison;
@@ -70,6 +71,19 @@ template <typename Key, typename Value> class StringTree
       left  = this;
       right = this;
     }
+
+    ~Node()
+    {
+      reset();
+      if (left && left->bit_count) {
+        std::destroy_at(left);
+      }
+
+      if (right && right->bit_count) {
+        std::destroy_at(right);
+      }
+    }
+
     Key key;
     Value value;
     /// bit pos where it differs from previous node.
@@ -77,14 +91,21 @@ template <typename Key, typename Value> class StringTree
     /// key/value rank.
     int32_t rank;
     /// only two ways, btree
-    self_type *left;
-    self_type *right;
+    self_type *left{nullptr};
+    self_type *right{nullptr};
 
     Node()                        = delete;
     Node(Node const &)            = delete;
     Node(Node &&)                 = delete;
     Node &operator=(Node const &) = delete;
     Node &operator=(Node &&)      = delete;
+
+  private:
+    void
+    reset()
+    {
+      this->bit_count = 0;
+    }
   };
   // types
   using node_type     = Node;
@@ -129,10 +150,7 @@ private:
   node_type_ptr _head;
   /// this gets incremented on every insert.
   int32_t _rank_counter{0};
-  /// recursive memory cleanup function.
-  void freeup(Node *n);
-  /// clean up function, should deal with all the crap.
-  void cleanup();
+  swoc::MemArena _arena; ///< Storage for nodes
 };
 
 /// 
--------------------------------------------------------------------------------------------------------------------
@@ -215,13 +233,13 @@ template <typename Key, typename Value> StringTree<Key, 
Value>::StringTree()
   // We do not set the rank now, as for the head, -1 should be ok.
   // we may be able to no need to initialize empty string if Key=string_view, 
thinking about this
   // as isPrefix may badly fail if null. Maybe check for head(before call to 
isPrefix).
-  _head            = new Node(Key{""}, Value{});
+  _head            = _arena.make<Node>(Key{""}, Value{});
   _head->bit_count = 0;
 }
 
 template <typename Key, typename Value> StringTree<Key, Value>::~StringTree()
 {
-  cleanup();
+  std::destroy_at(_head);
 }
 
 template <typename Key, typename Value>
@@ -247,7 +265,7 @@ StringTree<Key, Value>::insert(Key const &key, Value const 
&value, Comparison *c
   std::size_t const first_diff_bit = (search_node == _head ? 1 : 
detail::get_first_diff_bit_position(key, search_node->key));
 
   // Getting ready the new node.
-  node_type_ptr new_node = new Node(key, value, _rank_counter++);
+  node_type_ptr new_node = _arena.make<Node>(key, value, _rank_counter++);
 
   // we will work on this two from now. Always left to start.
   node_type_ptr p = _head;
@@ -363,33 +381,6 @@ StringTree<Key, Value>::prefix_match(Key const &prefix, 
Comparison *cmp) const
   return search;
 }
 
-template <typename Key, typename Value>
-void
-StringTree<Key, Value>::freeup(Node *n)
-{
-  if (n == nullptr) {
-    return;
-  }
-
-  node_type_ptr left  = n->left;
-  node_type_ptr right = n->right;
-
-  if (left->bit_count >= n->bit_count && (left != n && left != _head)) {
-    freeup(left);
-  }
-  if (right->bit_count >= n->bit_count && (right != n && right != _head)) {
-    freeup(right);
-  }
-  // ^^ should catch the nullptr
-  delete n;
-}
-
-template <typename Key, typename Value>
-void
-StringTree<Key, Value>::cleanup()
-{
-  freeup(_head);
-}
 /// 
--------------------------------------------------------------------------------------------------------------------
 
 ///

Reply via email to