X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=nucleus%2Flibrary%2Fnodes%2Ftree.cpp;h=38105f74a60bdf43f6cbc5a600d3ff241fb466ff;hb=84fc634d86157509079210d5b103deaa2122f9b7;hp=2a88061cada797e432fc2108d0c4874395db22e7;hpb=37cab48c3be29e1b41929cae3f5fb63d65fd344e;p=feisty_meow.git diff --git a/nucleus/library/nodes/tree.cpp b/nucleus/library/nodes/tree.cpp index 2a88061c..38105f74 100644 --- a/nucleus/library/nodes/tree.cpp +++ b/nucleus/library/nodes/tree.cpp @@ -17,14 +17,17 @@ #include #include #include +#include //#define DEBUG_TREE // uncomment if you want lots of debugging info. #undef LOG -#define LOG(s) CLASS_EMERGENCY_LOG(program_wide_logger::get(), s) +///#define LOG(s) CLASS_EMERGENCY_LOG(program_wide_logger::get(), s) +#define LOG(s) CLASS_EMERGENCY_LOG(program_wide_logger::get(), astring(s) + a_sprintf(" [obj=%p]", this)) using namespace basis; +using namespace loggers; namespace nodes { @@ -54,8 +57,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) { @@ -274,13 +277,17 @@ tree::tree() tree::~tree() { + FUNCDEF("destructor"); +LOG("entry to tree destructor"); // must at least unhook ourselves from the parent so we don't become a lost // cousin. tree *my_parent = parent(); if (my_parent) my_parent->prune(this); my_parent = NULL_POINTER; // disavow since we are loose now. -#if 0 +#if 1 + //hmmm: clean this code when it's been examined long enough. maybe already. +LOG("old code for tree destructor activating..."); //original version suffers from being too recursive on windoze, //which blows out the stack. linux never showed this problem. so, i @@ -294,10 +301,12 @@ tree::~tree() while (branches()) delete branch(0); // this relies on the child getting out of our branch list. #else +LOG("new code for tree destructor activating..."); // 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; @@ -308,10 +317,12 @@ tree::~tree() if (curr_node == NULL_POINTER) { // wayback has no children, so we can take action. +LOG("tree dtor: can take action on childless node..."); // if wayback is the same as "this", then we exit from iterations since // we've cleaned all the kids out. if (way_back == this) { +LOG("tree dtor: breaking out since at wayback node..."); break; } @@ -320,19 +331,17 @@ tree::~tree() // 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. - +LOG("tree dtor: reset currnode, about to whack wayback..."); + WHACK(way_back); // whack a node, finally. +LOG("tree dtor: after whacking wayback..."); } else { // okay, there's a node below here. we will spider down to it. +LOG("tree dtor: spidering to node below..."); continue; } - - } #endif - - } tree *tree::parent() const { return (tree *)get_link(BACKWARDS_BRANCH); }