summaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authorGiacomo Travaglini <giacomo.travaglini@arm.com>2019-05-03 13:51:50 +0100
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2019-06-09 11:03:04 +0000
commit21573956f7b2be8479af25b2e6cfa6c2ec8fae8e (patch)
tree90e46553908869b05cb82a92d0e6dd337aae1a53 /src/base
parent2833eb91ea1266f9bab8be8804ba945451f5b561 (diff)
downloadgem5-21573956f7b2be8479af25b2e6cfa6c2ec8fae8e.tar.xz
base: Provide a getter for Fiber::started boolean variable
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>
Diffstat (limited to 'src/base')
-rw-r--r--src/base/fiber.cc4
-rw-r--r--src/base/fiber.hh8
-rw-r--r--src/base/fiber.test.cc36
3 files changed, 44 insertions, 4 deletions
diff --git a/src/base/fiber.cc b/src/base/fiber.cc
index 177459aaa..f4496b14b 100644
--- a/src/base/fiber.cc
+++ b/src/base/fiber.cc
@@ -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.
diff --git a/src/base/fiber.hh b/src/base/fiber.hh
index 4d95e032b..ed95050b0 100644
--- a/src/base/fiber.hh
+++ b/src/base/fiber.hh
@@ -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();
};
diff --git a/src/base/fiber.test.cc b/src/base/fiber.test.cc
index 7e7bfefe8..6276df253 100644
--- a/src/base/fiber.test.cc
+++ b/src/base/fiber.test.cc
@@ -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>
@@ -35,6 +48,29 @@
#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: