nodestack: add stub 'get_next_read_from()' function
[c11tester.git] / model.cc
index f12e4d27db44af7b3593067c806c539ce930ced9..884ed64d0b30b51ec73954e3797f10a2e70fe793 100644 (file)
--- a/model.cc
+++ b/model.cc
@@ -26,7 +26,7 @@ ModelChecker::ModelChecker()
        diverge(NULL),
        nextThread(THREAD_ID_T_NONE),
        action_trace(new action_list_t()),
-       thread_map(new std::map<int, class Thread *>),
+       thread_map(new std::map<int, Thread *>),
        obj_thrd_map(new std::map<void *, std::vector<action_list_t> >()),
        thrd_last_action(new std::vector<ModelAction *>(1)),
        node_stack(new NodeStack()),
@@ -37,7 +37,7 @@ ModelChecker::ModelChecker()
 /** @brief Destructor */
 ModelChecker::~ModelChecker()
 {
-       std::map<int, class Thread *>::iterator it;
+       std::map<int, Thread *>::iterator it;
        for (it = thread_map->begin(); it != thread_map->end(); it++)
                delete (*it).second;
        delete thread_map;
@@ -78,7 +78,7 @@ int ModelChecker::get_num_threads()
 }
 
 /** @returns a sequence number for a new ModelAction */
-int ModelChecker::get_next_seq_num()
+modelclock_t ModelChecker::get_next_seq_num()
 {
        return ++used_sequence_numbers;
 }
@@ -323,6 +323,9 @@ void ModelChecker::build_reads_from_past(ModelAction *curr)
 
        ASSERT(curr->is_read());
 
+       /* Track whether this object has been initialized */
+       bool initialized = false;
+
        for (i = 0; i < thrd_lists->size(); i++) {
                action_list_t *list = &(*thrd_lists)[i];
                action_list_t::reverse_iterator rit;
@@ -340,11 +343,28 @@ void ModelChecker::build_reads_from_past(ModelAction *curr)
                        }
                        curr->get_node()->add_read_from(act);
 
-                       /* Include at most one act that "happens before" curr */
-                       if (act->happens_before(curr))
+                       /* Include at most one act per-thread that "happens before" curr */
+                       if (act->happens_before(curr)) {
+                               initialized = true;
                                break;
+                       }
                }
        }
+
+       if (!initialized) {
+               /* TODO: need a more informative way of reporting errors */
+               printf("ERROR: may read from uninitialized atomic\n");
+       }
+
+       if (DBG_ENABLED() || !initialized) {
+               printf("Reached read action:\n");
+               curr->print();
+               printf("Printing may_read_from\n");
+               curr->get_node()->print_may_read_from();
+               printf("End printing may_read_from\n");
+       }
+
+       ASSERT(initialized);
 }
 
 static void print_list(action_list_t *list)