[PPL-devel] [GIT] ppl/ppl(master): Fixed a couple of resource allocation problems ( reported by Marco Poletti).
Enea Zaffanella
zaffanella at cs.unipr.it
Thu Mar 18 07:44:02 CET 2010
Module: ppl/ppl
Branch: master
Commit: 71aa196a1784744ace2efba7d98b39f9ce44dd35
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=71aa196a1784744ace2efba7d98b39f9ce44dd35
Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date: Wed Mar 17 17:12:07 2010 +0100
Fixed a couple of resource allocation problems (reported by Marco Poletti).
---
src/PIP_Tree.cc | 22 +++++++++++++++-------
1 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index f2a06dc..2dd7c79 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -2109,6 +2109,11 @@ PIP_Solution_Node::solve(const PIP_Problem& pip,
// Recusively solve true node wrt updated context.
t_node = t_node->solve(pip, check_feasible_context,
context, all_params, space_dim);
+ // Resolution may have changed t_node: in case, rewrap it.
+ if (t_node != wrapped_node.get()) {
+ wrapped_node.release();
+ wrapped_node.reset(t_node);
+ }
// Modify *this in place to become the "false" version of current node.
PIP_Tree_Node* f_node = this;
@@ -2159,10 +2164,10 @@ PIP_Solution_Node::solve(const PIP_Problem& pip,
// create a new decision node.
PIP_Tree_Node* parent
= new PIP_Decision_Node(f_node->get_owner(), f_node, t_node);
- // Protect 'parent' from exception safety issues
- // (previously wrapped t_node is now safe).
+ // Previously wrapped 't_node' is now safe: release it
+ // and protect new 'parent' node from exception safety issues.
wrapped_node.release();
- wrapped_node = std::auto_ptr<PIP_Tree_Node>(parent);
+ wrapped_node.reset(parent);
// Add t_test to the constraints of the new decision node.
parent->add_constraint(t_test, all_params);
@@ -2170,14 +2175,17 @@ PIP_Solution_Node::solve(const PIP_Problem& pip,
if (!cs.empty()) {
// If node to be solved had tautologies,
// store them in a new decision node.
- // NOTE: this is exception safe.
parent = new PIP_Decision_Node(parent->get_owner(), 0, parent);
+ // Previously wrapped 'parent' node is now safe: release it
+ // and protect new 'parent' node from exception safety issues.
+ wrapped_node.release();
+ wrapped_node.reset(parent);
parent->constraints_.swap(cs);
}
parent->artificial_parameters.swap(aps);
- // It is now safe to release previously wrapped decision node.
- wrapped_node.release();
- return parent;
+ // It is now safe to release previously wrapped decision node
+ // and return it to the caller.
+ return wrapped_node.release();
} // if (first_mixed != not_a_dim)
More information about the PPL-devel
mailing list