base: Provide a getter for Fiber::started boolean variable
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Fri, 3 May 2019 12:51:50 +0000 (13:51 +0100)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Sun, 9 Jun 2019 11:03:04 +0000 (11:03 +0000)
This can be used to check if the fiber has started its execution.

Change-Id: Ie9222b8076756363c9f82c1333c76a352bcaf817
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18648
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/base/fiber.cc
src/base/fiber.hh
src/base/fiber.test.cc

index 177459aaae24341bb70255e9d14a84386f2605d7..f4496b14bb345f8c025f7fb606e336c0611cd6ae 100644 (file)
@@ -88,7 +88,7 @@ Fiber::Fiber(size_t stack_size) : Fiber(primaryFiber(), stack_size)
 
 Fiber::Fiber(Fiber *link, size_t stack_size) :
     link(link), stack(nullptr), stackSize(stack_size), guardPage(nullptr),
-    guardPageSize(sysconf(_SC_PAGE_SIZE)), started(false), _finished(false)
+    guardPageSize(sysconf(_SC_PAGE_SIZE)), _started(false), _finished(false)
 {
     if (stack_size) {
         guardPage = mmap(nullptr, guardPageSize + stack_size,
@@ -170,7 +170,7 @@ Fiber::run()
     if (_currentFiber == this)
         return;
 
-    if (!started)
+    if (!_started)
         createContext();
 
     // Switch out of the current Fiber's context and this one's in.
index 4d95e032bc47320b0b695d4ec1ac412aa7cef0a5..ed95050b08f7e8e21952f9e508879dc6ea901361 100644 (file)
@@ -82,6 +82,10 @@ class Fiber
     ///
     bool finished() const { return _finished; };
 
+    /// Returns whether the "main" function of this fiber has started.
+    ///
+    bool started() const { return _started; };
+
     /// Get a pointer to the current running Fiber.
     ///
     static Fiber *currentFiber();
@@ -96,7 +100,7 @@ class Fiber
     /// mark itself as finished and switch to its link fiber.
     virtual void main() = 0;
 
-    void setStarted() { started = true; }
+    void setStarted() { _started = true; }
 
   private:
     static void entryTrampoline();
@@ -114,7 +118,7 @@ class Fiber
     unsigned valgrindStackId;
 #endif
 
-    bool started;
+    bool _started;
     bool _finished;
     void createContext();
 };
index 7e7bfefe8e1966edd8a6a549d1cf4f911db400b5..6276df2534023e1e3c5c22db0c0bced023569172 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2019 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright 2018 Google, Inc.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -25,6 +37,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Gabe Black
+ *          Giacomo Travaglini
  */
 
 #include <gtest/gtest.h>
 
 #include "base/fiber.hh"
 
+/** This test is checking if the "started" member has its expected
+ * value before and after the fiber runs. In the test an empty fiber
+ * is used since we are just interested on the _started member and
+ * nothing more.
+ */
+TEST(Fiber, Starting)
+{
+    class StartingFiber : public Fiber
+    {
+      public:
+        StartingFiber(Fiber *link) : Fiber(link) {}
+        void main() { /** Do nothing */ }
+    };
+
+    StartingFiber fiber(Fiber::primaryFiber());
+
+    ASSERT_FALSE(fiber.started());
+
+    fiber.run();
+
+    ASSERT_TRUE(fiber.started());
+}
+
 class SwitchingFiber : public Fiber
 {
   public: