Fix intermix of node functors and node delete.

This commit is contained in:
steve 2002-08-16 05:18:27 +00:00
parent dd564ab321
commit c794aa02b8
3 changed files with 52 additions and 24 deletions

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: functor.cc,v 1.30 2002/08/12 01:34:59 steve Exp $"
#ident "$Id: functor.cc,v 1.31 2002/08/16 05:18:27 steve Exp $"
#endif
# include "config.h"
@ -128,30 +128,31 @@ void Design::functor(functor_t*fun)
// apply to nodes
if (nodes_) {
assert(nodes_functor_cur_ == 0);
assert(nodes_functor_nxt_ == 0);
/* Scan the circular list of nodes, starting with the
front of the list. (nodes_ points to the *end* of the
list.) The bar is the end point. At the end of the
do-while loop, I know that the bar has been
processed or (if bar == 0) no undeleted node has been
processed. */
NetNode*cur = nodes_->node_next_;
NetNode*bar = 0;
front of the list.
This loop interacts with the Design::del_node method
so that the functor is free to delete any nodes it
choose. The destructors of the NetNode objects call
the del_node method, which checks with the
nodes_functor_* members, to keep the iterator
operating safely. */
nodes_functor_cur_ = nodes_;
do {
NetNode*tmp = cur->node_next_;
cur->functor_node(this, fun);
nodes_functor_nxt_ = nodes_functor_cur_->node_next_;
nodes_functor_cur_->functor_node(this, fun);
/* Detect the case that cur has been deleted by
noticing if tmp->node_prev_ no longer points to
cur. If that's the case, clear the bar. */
if (tmp->node_prev_ != cur) {
if (cur == bar)
bar = 0;
} else if (bar == 0) {
bar = cur;
}
cur = tmp;
if (nodes_functor_nxt_ == 0)
break;
nodes_functor_cur_ = nodes_functor_nxt_;
} while (nodes_ && (nodes_functor_cur_ != nodes_));
nodes_functor_cur_ = 0;
nodes_functor_nxt_ = 0;
} while (nodes_ && (cur != bar));
}
}
@ -266,6 +267,9 @@ int proc_match_t::event_wait(NetEvWait*)
/*
* $Log: functor.cc,v $
* Revision 1.31 2002/08/16 05:18:27 steve
* Fix intermix of node functors and node delete.
*
* Revision 1.30 2002/08/12 01:34:59 steve
* conditional ident string using autoconfig.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: net_design.cc,v 1.26 2002/08/12 01:34:59 steve Exp $"
#ident "$Id: net_design.cc,v 1.27 2002/08/16 05:18:27 steve Exp $"
#endif
# include "config.h"
@ -38,6 +38,8 @@ Design:: Design()
{
procs_idx_ = 0;
des_precision_ = 0;
nodes_functor_cur_ = 0;
nodes_functor_nxt_ = 0;
}
Design::~Design()
@ -442,6 +444,19 @@ void Design::add_node(NetNode*net)
void Design::del_node(NetNode*net)
{
assert(net->design_ == this);
assert(net != 0);
/* Interact with the Design::functor method by manipulate the
cur and nxt pointers that is is using. */
if (net == nodes_functor_nxt_)
nodes_functor_nxt_ = nodes_functor_nxt_->node_next_;
if (net == nodes_functor_nxt_)
nodes_functor_nxt_ = 0;
if (net == nodes_functor_cur_)
nodes_functor_cur_ = 0;
/* Now perform the actual delete. */
if (nodes_ == net)
nodes_ = net->node_prev_;
@ -485,6 +500,9 @@ void Design::delete_process(NetProcTop*top)
/*
* $Log: net_design.cc,v $
* Revision 1.27 2002/08/16 05:18:27 steve
* Fix intermix of node functors and node delete.
*
* Revision 1.26 2002/08/12 01:34:59 steve
* conditional ident string using autoconfig.
*

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: netlist.h,v 1.257 2002/08/12 01:35:00 steve Exp $"
#ident "$Id: netlist.h,v 1.258 2002/08/16 05:18:27 steve Exp $"
#endif
/*
@ -2950,8 +2950,11 @@ class Design {
// tree and per-hop searches for me.
list<NetScope*>root_scopes_;
// List the nodes in the design
// List the nodes in the design.
NetNode*nodes_;
// These are in support of the node functor iterator.
NetNode*nodes_functor_cur_;
NetNode*nodes_functor_nxt_;
// List the processes in the design.
NetProcTop*procs_;
@ -3008,6 +3011,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
/*
* $Log: netlist.h,v $
* Revision 1.258 2002/08/16 05:18:27 steve
* Fix intermix of node functors and node delete.
*
* Revision 1.257 2002/08/12 01:35:00 steve
* conditional ident string using autoconfig.
*