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:
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user