From ed73252cff03383a802a9608a97e5234bc90fcc4 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Tue, 2 Apr 2013 18:11:49 -0700 Subject: [PATCH] threads: remove wait_list We can glean the "thread waiting" information without recording it directly in a list for each thread. --- model.cc | 10 ++++++---- threads-model.h | 34 ---------------------------------- threads.cc | 2 -- 3 files changed, 6 insertions(+), 40 deletions(-) diff --git a/model.cc b/model.cc index 4d62361..557d103 100644 --- a/model.cc +++ b/model.cc @@ -1219,9 +1219,12 @@ bool ModelChecker::process_thread_action(ModelAction *curr) } case THREAD_FINISH: { Thread *th = get_thread(curr); - while (!th->wait_list_empty()) { - ModelAction *act = th->pop_wait_list(); - scheduler->wake(get_thread(act)); + /* Wake up any joining threads */ + for (unsigned int i = 0; i < get_num_threads(); i++) { + Thread *waiting = get_thread(int_to_id(i)); + if (waiting->waiting_on() == th && + waiting->get_pending()->is_thread_join()) + scheduler->wake(waiting); } th->complete(); /* Completed thread can't satisfy promises */ @@ -1464,7 +1467,6 @@ bool ModelChecker::check_action_enabled(ModelAction *curr) { } else if (curr->is_thread_join()) { Thread *blocking = curr->get_thread_operand(); if (!blocking->is_complete()) { - blocking->push_wait_list(curr); thread_blocking_check_promises(blocking, get_thread(curr)); return false; } diff --git a/threads-model.h b/threads-model.h index eed11cb..ef2c9e1 100644 --- a/threads-model.h +++ b/threads-model.h @@ -78,23 +78,6 @@ public: /** @return True if this thread is blocked */ bool is_blocked() const { return state == THREAD_BLOCKED; } - /** @return True if no threads are waiting on this Thread */ - bool wait_list_empty() const { return wait_list.empty(); } - - /** - * Add a ModelAction to the waiting list for this thread. - * @param t The ModelAction to add. Must be a JOIN. - */ - void push_wait_list(ModelAction *act) { wait_list.push_back(act); } - - unsigned int num_wait_list() const { - return wait_list.size(); - } - - ModelAction * get_waiter(unsigned int i) const { - return wait_list[i]; - } - /** @return The pending (next) ModelAction for this Thread * @see Thread::pending */ ModelAction * get_pending() const { return pending; } @@ -107,16 +90,6 @@ public: Thread * waiting_on() const; bool is_waiting_on(const Thread *t) const; - /** - * Remove one ModelAction from the waiting list - * @return The ModelAction that was removed from the waiting list - */ - ModelAction * pop_wait_list() { - ModelAction *ret = wait_list.front(); - wait_list.pop_back(); - return ret; - } - bool is_model_thread() const { return model_thread; } friend void thread_startup(); @@ -165,13 +138,6 @@ private: thread_id_t id; thread_state state; - /** - * A list of ModelActions waiting on this Thread. Particularly, this - * list is used for thread joins, where another Thread waits for this - * Thread to complete - */ - SnapVector wait_list; - /** * The value returned by the last action in this thread * @see Thread::set_return_value() diff --git a/threads.cc b/threads.cc index e4b4656..5bfd028 100644 --- a/threads.cc +++ b/threads.cc @@ -139,7 +139,6 @@ Thread::Thread(thread_id_t tid) : user_thread(NULL), id(tid), state(THREAD_READY), /* Thread is always ready? */ - wait_list(), last_action_val(0), model_thread(true) { @@ -160,7 +159,6 @@ Thread::Thread(thrd_t *t, void (*func)(void *), void *a, Thread *parent) : arg(a), user_thread(t), state(THREAD_CREATED), - wait_list(), last_action_val(VALUE_NONE), model_thread(false) { -- 2.34.1