return;
HashTable<void *, value_set_t *, uintptr_t, 0> * write_history = history->getWriteHistory();
+ HashSet<ModelAction *, uintptr_t, 2> write_actions;
/* build inst_list from act_list for later processing */
func_inst_list_t inst_list;
for (sllnode<ModelAction *> * it = act_list->begin();it != NULL;it = it->getNext()) {
ModelAction * act = it->getVal();
- act->setFuncActRef(NULL); // Remove func_act_ref so that this action can be removed
+
+ // Use the original action type and decrement ref count
+ // so that actions may be deleted by Execution::collectActions
+ if (act->get_original_type() != ATOMIC_NOP && act->get_swap_flag() == false)
+ act->use_original_type();
+
+ act->decr_func_ref_count();
+
+ if (act->is_read()) {
+ // For every read or rmw actions in this list, the reads_from was marked, and not deleted.
+ // So it is safe to call get_reads_from
+ ModelAction * rf = act->get_reads_from();
+ if (rf->get_original_type() != ATOMIC_NOP && rf->get_swap_flag() == false)
+ rf->use_original_type();
+
+ rf->decr_func_ref_count();
+ }
+
FuncInst * func_inst = get_inst(act);
void * loc = act->get_location();
}
}
-// model_print("function %s\n", func_name);
-// print_val_loc_map();
-
update_inst_tree(&inst_list);
update_predicate_tree(&rw_act_list);
+ // Revert back action types and free
+ for (sllnode<ModelAction *> * it = act_list->begin(); it != NULL;) {
+ ModelAction * act = it->getVal();
+ // Do iteration early in case we delete read actions
+ it = it->getNext();
+
+ // Collect write actions and reads_froms
+ if (act->is_read()) {
+ if (act->is_rmw()) {
+ write_actions.add(act);
+ }
+
+ ModelAction * rf = act->get_reads_from();
+ write_actions.add(rf);
+ } else if (act->is_write()) {
+ write_actions.add(act);
+ }
+
+ // Revert back action types
+ if (act->is_read()) {
+ ModelAction * rf = act->get_reads_from();
+ if (rf->get_swap_flag() == true)
+ rf->use_original_type();
+ }
+
+ if (act->get_swap_flag() == true)
+ act->use_original_type();
+
+ // Free read actions
+ if (act->is_read()) {
+ if (act->is_rmw()) {
+ // Do nothing. Its reads_from can not be READY_FREE
+ } else {
+ ModelAction *rf = act->get_reads_from();
+ if (rf->is_free()) {
+ model_print("delete read %d; %p\n", act->get_seq_number(), act);
+ delete act;
+ }
+ }
+ }
+ }
+
+ // Free write actions if possible
+ HSIterator<ModelAction *, uintptr_t, 2> * it = write_actions.iterator();
+ while (it->hasNext()) {
+ ModelAction * act = it->next();
+
+ if (act->is_free() && act->get_func_ref_count() == 0)
+ delete act;
+ }
+ delete it;
+
// print_predicate_tree();
}