sim: Remove _numContexts member in System class
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Mon, 5 Feb 2018 17:08:43 +0000 (17:08 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Fri, 9 Feb 2018 15:09:00 +0000 (15:09 +0000)
A System object has a _numContexts member variable which represent the
number of ThreadContext registered in the System.  Since this has to
match the size of the ThreadContext vector, this patch removes the
manually cached size. This was usually used as a for-loop index, whereas
we want to enforce the use of range-based loops whenever possible.

Change-Id: I1ba317c0393bcc9c1aeebbb1fc22d7b2bc2cf90c
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/8062
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Brandon Potter <Brandon.Potter@amd.com>

src/arch/arm/kvm/gic.cc
src/arch/arm/linux/system.cc
src/sim/system.cc
src/sim/system.hh

index 887fa8d697ee63e21347e43aad6df7b956674a0f..d2423a6ec9719b9e9a79d9c4695d348810c2a644 100644 (file)
@@ -305,7 +305,7 @@ void
 MuxingKvmGic::copyBankedDistRange(BaseGicRegisters* from, BaseGicRegisters* to,
                                   Addr daddr, size_t size)
 {
-    for (int ctx = 0; ctx < system._numContexts; ++ctx)
+    for (int ctx = 0; ctx < system.numContexts(); ++ctx)
         for (auto a = daddr; a < daddr + size; a += 4)
             copyDistRegister(from, to, ctx, a);
 }
@@ -314,7 +314,7 @@ void
 MuxingKvmGic::clearBankedDistRange(BaseGicRegisters* to,
                                    Addr daddr, size_t size)
 {
-    for (int ctx = 0; ctx < system._numContexts; ++ctx)
+    for (int ctx = 0; ctx < system.numContexts(); ++ctx)
         for (auto a = daddr; a < daddr + size; a += 4)
             to->writeDistributor(ctx, a, 0xFFFFFFFF);
 }
@@ -345,7 +345,7 @@ MuxingKvmGic::copyGicState(BaseGicRegisters* from, BaseGicRegisters* to)
     // Copy CPU Interface Control Register (CTLR),
     //      Interrupt Priority Mask Register (PMR), and
     //      Binary Point Register (BPR)
-    for (int ctx = 0; ctx < system._numContexts; ++ctx) {
+    for (int ctx = 0; ctx < system.numContexts(); ++ctx) {
         copyCpuRegister(from, to, ctx, GICC_CTLR);
         copyCpuRegister(from, to, ctx, GICC_PMR);
         copyCpuRegister(from, to, ctx, GICC_BPR);
@@ -423,7 +423,7 @@ MuxingKvmGic::fromKvmToPl390()
     // have been shifted by three bits due to its having been emulated by
     // a VGIC with only 5 PMR bits in its VMCR register.  Presently the
     // Linux kernel does not repair this inaccuracy, so we correct it here.
-    for (int cpu = 0; cpu < system._numContexts; ++cpu) {
+    for (int cpu = 0; cpu < system.numContexts(); ++cpu) {
        cpuPriority[cpu] <<= 3;
        assert((cpuPriority[cpu] & ~0xff) == 0);
     }
index 7f06475125c9505409e8f1600580060bbd17131f..094e4d7a723c8a521e4f4d9711e35d45177eca25 100644 (file)
@@ -250,8 +250,7 @@ LinuxArmSystem::startup()
         std::string task_filename = "tasks.txt";
         taskFile = simout.create(name() + "." + task_filename);
 
-        for (int i = 0; i < _numContexts; i++) {
-            ThreadContext *tc = threadContexts[i];
+        for (const auto tc : threadContexts) {
             uint32_t pid = tc->getCpuPtr()->getPid();
             if (pid != BaseCPU::invldPid) {
                 mapPid(tc, pid);
index ed01e0e64c66f9a456a8cfd2daa9605c8893051f..38eed1c2ab73edbb39d29e947c7dff512ef45582 100644 (file)
@@ -47,6 +47,8 @@
 
 #include "sim/system.hh"
 
+#include <algorithm>
+
 #include "arch/remote_gdb.hh"
 #include "arch/utility.hh"
 #include "base/loader/object_file.hh"
@@ -87,7 +89,6 @@ int System::numSystemsRunning = 0;
 
 System::System(Params *p)
     : MemObject(p), _systemPort("system_port", this),
-      _numContexts(0),
       multiThread(p->multi_thread),
       pagePtr(0),
       init_param(p->init_param),
@@ -256,7 +257,6 @@ System::registerThreadContext(ThreadContext *tc, ContextID assigned)
              "Cannot have two CPUs with the same id (%d)\n", id);
 
     threadContexts[id] = tc;
-    _numContexts++;
 
 #if THE_ISA != NULL_ISA
     int port = getRemoteGDBPort();
@@ -287,12 +287,13 @@ System::registerThreadContext(ThreadContext *tc, ContextID assigned)
 int
 System::numRunningContexts()
 {
-    int running = 0;
-    for (int i = 0; i < _numContexts; ++i) {
-        if (threadContexts[i]->status() != ThreadContext::Halted)
-            ++running;
-    }
-    return running;
+    return std::count_if(
+        threadContexts.cbegin(),
+        threadContexts.cend(),
+        [] (ThreadContext* tc) {
+            return tc->status() != ThreadContext::Halted;
+        }
+    );
 }
 
 void
index 5b0c1787297a9ef0ac31c2220e0cff8b8cfbe76a..a72f2a762aa5d5b8313c293f1a5001e067c51aab 100644 (file)
@@ -196,7 +196,6 @@ class System : public MemObject
 #endif
 
     std::vector<ThreadContext *> threadContexts;
-    int _numContexts;
     const bool multiThread;
 
     ThreadContext *getThreadContext(ContextID tid)
@@ -204,11 +203,7 @@ class System : public MemObject
         return threadContexts[tid];
     }
 
-    int numContexts()
-    {
-        assert(_numContexts == (int)threadContexts.size());
-        return _numContexts;
-    }
+    unsigned numContexts() const { return threadContexts.size(); }
 
     /** Return number of running (non-halted) thread contexts in
      * system.  These threads could be Active or Suspended. */