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>
This commit is contained in:
Giacomo Travaglini
2019-05-03 13:51:50 +01:00
parent 2833eb91ea
commit 21573956f7
3 changed files with 44 additions and 4 deletions

View 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.

View 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();
};

View 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>
@@ -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: