let update_tree_after_refinment entry_pts unprocessed_nodes ts coverers =
let rec update_and_compute n =
Format.printf "@.Found node:@.";
print_node Format.std_formatter n;
Format.printf "@.with %d children@." (List.length (Tree.get_children n));
let n_data = get_node_data n in
(match n_data.mark with
Unprocessed ->
assert (not (Tree.has_child n)) ;
begin
match (Options.getValueOfString "comp") with
"path" -> ();
| _ ->
unprocessed_nodes#add_element n ;
Message.msg_string Message.Debug "Adding to unprocessed#nodes";
Message.msg_printer Message.Debug print_tree_node n ;
end
| Processed_Was_Covered_To_Reprocess md ->
assert (not (Tree.has_child n)) ;
begin
match (Options.getValueOfString "comp") with
"path" -> ()
| _ ->
Message.msg_string Message.Debug "Adding to unprocessed#nodes";
Message.msg_printer Message.Debug print_tree_node n ;
unprocessed_nodes#add_element n ;
Region.addCoverer coverers md.region n
end
| Processed_Covered md ->
assert (not (Tree.has_child n)) ;
if md.time_stamp >= ts || called_after md ts then
begin
print_string "Redo covered node!\n";
n_data.mark <- Processed_Was_Covered_To_Reprocess md ;
Message.msg_string Message.Debug "Adding to unprocessed#nodes";
Message.msg_printer Message.Debug print_tree_node n ;
unprocessed_nodes#add_element n
end
else
Region.addCoverer coverers md.region n
| Processed_Uncovered md ->
if called_after md ts then
begin
print_string "Redo uncovered node because of call!\n";
Tree.delete_children n;
n_data.mark <- Processed_Was_Covered_To_Reprocess md ;
Message.msg_string Message.Debug "Adding to unprocessed#nodes";
Message.msg_printer Message.Debug print_tree_node n ;
unprocessed_nodes#add_element n
end
else
begin
Format.printf "This node's function target was called early enough: %d vs. " ts;
(match md.call_time_stamp with
None -> Format.printf "NONE@."
| Some t -> Format.printf "%d@." t);
Region.addCoverer coverers md.region n
end)
in let funcs fname entries =
let update_entry entry =
let stamp = get_time_stamp entry in
Format.printf "Entry for %s: %d vs. %d@." fname stamp ts;
if stamp >= ts then
remove_pt entry_pts fname entry
else
update_and_compute entry
in nset_iter update_entry entries
in
Format.print_string "Updating tree after refinement....\n";
Region.clearCoverers coverers;
if ts = 0 then
begin
Format.printf "Start over again!@.";
let mainfn = List.hd (Options.getValueOfStringList "main") in
let tree_root = !(Hashtbl.find tree_node_table 0) in
clear_pts entry_pts;
add_pt entry_pts mainfn tree_root;
Tree.delete_children tree_root;
(get_node_data tree_root).mark <-
Processed_Was_Covered_To_Reprocess (get_marking_data tree_root);
unprocessed_nodes#add_element tree_root
end
else
Hashtbl.iter funcs entry_pts