promise: refactor eliminate_thread()/check_promise()
[model-checker.git] / promise.cc
1 #include "promise.h"
2 #include "model.h"
3 #include "schedule.h"
4
5 /**
6  * Eliminate a thread which no longer can satisfy this promise. Once all
7  * enabled threads have been eliminated, this promise is unresolvable.
8  *
9  * @param tid The thread ID of the thread to eliminate
10  * @return True, if this elimination has invalidated the promise; false
11  * otherwise
12  */
13 bool Promise::eliminate_thread(thread_id_t tid)
14 {
15         unsigned int id = id_to_int(tid);
16         if (id >= synced_thread.size())
17                 synced_thread.resize(id + 1, false);
18         if (synced_thread[id])
19                 return false;
20
21         synced_thread[id] = true;
22         return check_promise();
23 }
24
25 bool Promise::check_promise() const
26 {
27         unsigned int sync_size = synced_thread.size();
28         int promise_tid = id_to_int(read->get_tid());
29         for (unsigned int i = 1; i < model->get_num_threads(); i++) {
30                 if ((i >= sync_size || !synced_thread[i]) && ((int)i != promise_tid) && model->is_enabled(int_to_id(i))) {
31                         return false;
32                 }
33         }
34         return true;
35 }