schedule: reset scheduler when thread is removed
authorBrian Norris <banorris@uci.edu>
Tue, 24 Apr 2012 03:09:45 +0000 (20:09 -0700)
committerBrian Norris <banorris@uci.edu>
Tue, 24 Apr 2012 03:09:45 +0000 (20:09 -0700)
Ensure that the 'current' thread reference is removed properly.

model.cc
model.h
schedule.cc
schedule.h

index f50b0f9a60777557429c33ab7fc4b3236ef1cb6f..4f87da3efdd6b630973901a0f40e09b6420f55af 100644 (file)
--- a/model.cc
+++ b/model.cc
@@ -205,6 +205,11 @@ int ModelChecker::add_thread(Thread *t)
        return 0;
 }
 
+void ModelChecker::remove_thread(Thread *t)
+{
+       scheduler->remove_thread(t);
+}
+
 int ModelChecker::switch_to_master(ModelAction *act)
 {
        Thread *old, *next;
diff --git a/model.h b/model.h
index 64d052fcbf9b5cab928b3ebfbb62554aa7e42939..ca1de85c980cfa19b2179f9f68ee779bc90097e7 100644 (file)
--- a/model.h
+++ b/model.h
@@ -79,6 +79,7 @@ public:
        Thread * schedule_next_thread();
 
        int add_thread(Thread *t);
+       void remove_thread(Thread *t);
        Thread * get_thread(thread_id_t tid) { return thread_map[tid]; }
 
        int get_next_id();
index 67b40ec88a809d5c2bff10e07787481a7d934566..c9a1ce1ed8be0f9b7176585bb53aaa53f8be8cdf 100644 (file)
@@ -9,6 +9,14 @@ void Scheduler::add_thread(Thread *t)
        readyList.push_back(t);
 }
 
+void Scheduler::remove_thread(Thread *t)
+{
+       if (current == t)
+               current = NULL;
+       else
+               readyList.remove(t);
+}
+
 Thread * Scheduler::next_thread(void)
 {
        Thread *t = model->schedule_next_thread();
index 86e4e40da18c5bc41bfd3908d76b4c48dc80b20b..c633b28987d7ef97da5d1130060021260e65b0f6 100644 (file)
@@ -9,6 +9,7 @@
 class Scheduler {
 public:
        void add_thread(Thread *t);
+       void remove_thread(Thread *t);
        Thread * next_thread(void);
        Thread * get_current_thread(void);
        void print();