From: Chris Koeritz Date: Wed, 29 Sep 2021 05:19:56 +0000 (-0400) Subject: tracking down issues in sym tree destructor still X-Git-Tag: 2.140.134~12^2~3 X-Git-Url: https://feistymeow.org/gitweb/?a=commitdiff_plain;h=dfeba549161a42f001a6b8ec78c7e61911c1c3e5;p=feisty_meow.git tracking down issues in sym tree destructor still something definitely not right; we have shown that at least. --- diff --git a/nucleus/library/nodes/symbol_tree.cpp b/nucleus/library/nodes/symbol_tree.cpp index 947d4530..bd985a27 100644 --- a/nucleus/library/nodes/symbol_tree.cpp +++ b/nucleus/library/nodes/symbol_tree.cpp @@ -19,7 +19,7 @@ #include #include -#define DEBUG_SYMBOL_TREE +//#define DEBUG_SYMBOL_TREE // uncomment for totally noisy version. #include @@ -33,12 +33,14 @@ using namespace textual; namespace nodes { +//hmmm: used for... explain please. class symbol_tree_associations : public symbol_table { public: symbol_tree_associations(int estimated_elements) : symbol_table(estimated_elements) {} virtual ~symbol_tree_associations() { +//hmmm: why was this here? was it ever needed? // for (int i = 0; i < symbols(); i++) { // WHACK(use(i)); // } @@ -91,8 +93,12 @@ outcome symbol_tree::prune(tree *to_zap_in) FUNCDEF("prune"); #endif symbol_tree *to_zap = dynamic_cast(to_zap_in); - if (!to_zap) + if (!to_zap) { +#ifdef DEBUG_SYMBOL_TREE + LOG("about to barf due to null symtree after dynamic cast."); +#endif throw("error: symbol_tree::prune: wrong type of node in prune"); + } #ifdef DEBUG_SYMBOL_TREE LOG(astring("zapping node for ") + to_zap->name()); #endif diff --git a/nucleus/library/nodes/tree.cpp b/nucleus/library/nodes/tree.cpp index 08dd6df0..7398274b 100644 --- a/nucleus/library/nodes/tree.cpp +++ b/nucleus/library/nodes/tree.cpp @@ -19,7 +19,7 @@ #include #include -#define DEBUG_TREE +//#define DEBUG_TREE // uncomment if you want lots of debugging info. #undef LOG @@ -56,8 +56,8 @@ bool tree::iterator::next_node(tree *&to_return) #ifdef DEBUG_TREE if ( (_order != to_branches) && (_order != reverse_branches) ) { - if (_aim == AWAY_FROM_ROOT) LOG("going down") - else LOG("going up"); + if (_aim == AWAY_FROM_ROOT) LOG("going down...") + else LOG("going up..."); } #endif switch (_order) { @@ -284,6 +284,7 @@ tree::~tree() my_parent = NULL_POINTER; // disavow since we are loose now. #if 0 + //hmmm: clean this code when it's been examined long enough. maybe already. //original version suffers from being too recursive on windoze, //which blows out the stack. linux never showed this problem. so, i @@ -301,6 +302,7 @@ tree::~tree() // newer version of delete doesn't recurse; it just iterates instead, // which avoids the massive recursive depth of the original approach. tree *curr_node = this; + tree *stop_node = this; // don't whack self. while (curr_node != NULL_POINTER) { // make a breadcrumb for getting back to 'here' in the tree. tree *way_back = curr_node; @@ -309,11 +311,8 @@ tree::~tree() // or there are no kids at all. curr_node = curr_node->branch(0); -LOG(a_sprintf("loop traverse on %p", curr_node)); - if (curr_node == NULL_POINTER) { // wayback has no children, so we can take action. -LOG(a_sprintf("inside null condition, loop traverse on %p", curr_node)); // if wayback is the same as "this", then we exit from iterations since // we've cleaned all the kids out. @@ -326,19 +325,14 @@ LOG(a_sprintf("inside null condition, loop traverse on %p", curr_node)); // our remit, since wayback is not the same node as the top level one // in the destructor (as long as there are no cycles in the tree...). curr_node = way_back->parent(); // go up in tree on next iteration. - delete way_back; // whack a node, finally. - + WHACK(way_back); // whack a node, finally. } else { // okay, there's a node below here. we will spider down to it. continue; } - - } #endif - - } tree *tree::parent() const { return (tree *)get_link(BACKWARDS_BRANCH); } diff --git a/nucleus/library/tests_nodes/test_symbol_tree.cpp b/nucleus/library/tests_nodes/test_symbol_tree.cpp index bc938d1d..fa4a5c8c 100644 --- a/nucleus/library/tests_nodes/test_symbol_tree.cpp +++ b/nucleus/library/tests_nodes/test_symbol_tree.cpp @@ -28,9 +28,6 @@ #include #include -//#include -//#include - using namespace application; using namespace basis; using namespace filesystem; @@ -60,12 +57,11 @@ public: int test_symbol_tree::execute() { FUNCDEF("execute"); - LOG("please check memory usage and record it, then hit a key to start testing."); try { - // creates a crazy tree with only one branch per node, but 40,000 deep. - symbol_tree t("blork"); - symbol_tree *curr = &t; + // creates a crazy tree with only one branch per node, but hugely deep. + symbol_tree *t = new symbol_tree("blork"); + symbol_tree *curr = t; for (int i = 0; i < MAX_NODES_TESTED; i++) { // if the current node has any branches, we'll jump on one as the next // place. @@ -77,17 +73,16 @@ int test_symbol_tree::execute() astring rando = string_manipulation::make_random_name(1, 10); curr->add(new symbol_tree(rando)); } - LOG("check memory usage now with full size. then hit a key."); +LOG("about to whack dynamic tree..."); + WHACK(t); +LOG("dynamic tree whacked."); } catch (...) { LOG("crashed during tree stuffing."); return 1; } - LOG("check memory usage after the run. then hit a key to end " - "the program."); - -//create a more balanced tree structure... -//perform known operations and validate shape of tree. +//hmmm: create a more balanced tree structure... +// perform known operations and validate shape of tree. return final_report(); }