inorder: ready/suspend status fns
authorKorey Sewell <ksewell@umich.edu>
Sun, 31 Jan 2010 23:26:47 +0000 (18:26 -0500)
committerKorey Sewell <ksewell@umich.edu>
Sun, 31 Jan 2010 23:26:47 +0000 (18:26 -0500)
update/add in the use of isThreadReady & isThreadSuspended
functions.Check in activateThread what list a thread is
on so it can be managed accordingly.

src/cpu/inorder/cpu.cc
src/cpu/inorder/cpu.hh

index 954309a74028dc78e7ea19cb75ae43904026f5a4..ec6bb21eefb68ab3da3d864541414afd3fe23045 100644 (file)
@@ -628,7 +628,7 @@ InOrderCPU::scheduleCpuEvent(CPUEventType c_event, Fault fault,
     resPool->scheduleEvent(c_event, inst, 0, 0, tid);
 }
 
-inline bool
+bool
 InOrderCPU::isThreadActive(ThreadID tid)
 {
   list<ThreadID>::iterator isActive =
@@ -637,6 +637,23 @@ InOrderCPU::isThreadActive(ThreadID tid)
     return (isActive != activeThreads.end());
 }
 
+bool
+InOrderCPU::isThreadReady(ThreadID tid)
+{
+  list<ThreadID>::iterator isReady =
+      std::find(readyThreads.begin(), readyThreads.end(), tid);
+
+    return (isReady != readyThreads.end());
+}
+
+bool
+InOrderCPU::isThreadSuspended(ThreadID tid)
+{
+  list<ThreadID>::iterator isSuspended =
+      std::find(suspendedThreads.begin(), suspendedThreads.end(), tid);
+
+    return (isSuspended != suspendedThreads.end());
+}
 
 void
 InOrderCPU::activateNextReadyThread()
@@ -655,26 +672,40 @@ InOrderCPU::activateNextReadyThread()
         readyThreads.erase(ready_it);                        
     } else {
         DPRINTF(InOrderCPU,
-                "No Ready Threads to Activate.\n");
+                "Attempting to activate new thread, but No Ready Threads to"
+                "activate.\n");
     }        
 }
 
 void
 InOrderCPU::activateThread(ThreadID tid)
 {
+    if (isThreadSuspended(tid)) {
+        DPRINTF(InOrderCPU,
+                "Removing [tid:%i] from suspended threads list.\n", tid);
+
+        list<ThreadID>::iterator susp_it =
+            std::find(suspendedThreads.begin(), suspendedThreads.end(), 
+                      tid);
+        suspendedThreads.erase(susp_it);                        
+    }
+
     if (threadModel == SwitchOnCacheMiss &&
         numActiveThreads() == 1) {
         DPRINTF(InOrderCPU,
-                "Ignoring Activation of [tid:%i]. Placing on "
-                "ready list\n", tid);        
+                "Ignoring activation of [tid:%i], since [tid:%i] is "
+                "already running.\n", tid, activeThreadId());
+        
+        DPRINTF(InOrderCPU,"Placing [tid:%i] ready threads list\n", 
+                tid);        
 
         readyThreads.push_back(tid);
         
-    } else if (!isThreadActive(tid)) {
+    } else if (!isThreadActive(tid)) {                
         DPRINTF(InOrderCPU,
-                "Adding Thread %i to active threads list in CPU.\n", tid);
+                "Adding [tid:%i] to active threads list.\n", tid);
         activeThreads.push_back(tid);
-
+        
         wakeCPU();
     }
 }
@@ -710,6 +741,8 @@ InOrderCPU::deactivateThread(ThreadID tid)
 
         activeThreads.erase(thread_it);
     }
+
+    assert(!isThreadActive(tid));    
 }
 
 void
@@ -758,15 +791,6 @@ InOrderCPU::removePipelineStalls(ThreadID tid)
 
 }
 
-bool
-InOrderCPU::isThreadSuspended(ThreadID tid)
-{
-  list<ThreadID>::iterator isSuspended =
-      std::find(suspendedThreads.begin(), suspendedThreads.end(), tid);
-
-    return (isSuspended!= suspendedThreads.end());
-}
-
 void
 InOrderCPU::updateThreadPriority()
 {
index c31481421a861a23ca33ef35ac07c1fbf2f64fc1..f4f7cb39061485f15341986684423f7fd82428ec 100644 (file)
@@ -588,6 +588,7 @@ class InOrderCPU : public BaseCPU
 
     /** Thread Status Functions */
     bool isThreadActive(ThreadID tid);
+    bool isThreadReady(ThreadID tid);
     bool isThreadSuspended(ThreadID tid);
 
   private: