summaryrefslogtreecommitdiff
path: root/src/base/fiber.cc
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-08-22 16:49:22 -0700
committerGabe Black <gabeblack@google.com>2018-08-24 18:15:09 +0000
commita3385dadcb0ffb53da32d2690c0ea8157e2419bd (patch)
tree9af7ab099183937a851be9124961e4c26f5e7374 /src/base/fiber.cc
parentf741bb7cdbdd6c2526be40fe1e03a705364ddf8d (diff)
downloadgem5-a3385dadcb0ffb53da32d2690c0ea8157e2419bd.tar.xz
base: If valgrind is available, tell it about Fiber stacks.
Valgrind can get confused when switching stacks between different Fibers. If valgrind (and its headers) are available, this change adds calls to some hooks so valgrind knows where the new stacks are and doesn't report a bunch of false positives. Change-Id: I00aefe60372be6de7371dec29427d7182dbee7b6 Reviewed-on: https://gem5-review.googlesource.com/12227 Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br> Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/base/fiber.cc')
-rw-r--r--src/base/fiber.cc13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/base/fiber.cc b/src/base/fiber.cc
index f10f1fbfd..eac1d9394 100644
--- a/src/base/fiber.cc
+++ b/src/base/fiber.cc
@@ -29,6 +29,10 @@
#include "base/fiber.hh"
+#if HAVE_VALGRIND
+#include <valgrind/valgrind.h>
+#endif
+
#include <cerrno>
#include <cstring>
@@ -71,7 +75,11 @@ Fiber::Fiber(size_t stack_size) :
link(primaryFiber()),
stack(stack_size ? new uint8_t[stack_size] : nullptr),
stackSize(stack_size), started(false), _finished(false)
-{}
+{
+#if HAVE_VALGRIND
+ valgrindStackId = VALGRIND_STACK_REGISTER(stack, stack + stack_size);
+#endif
+}
Fiber::Fiber(Fiber *link, size_t stack_size) :
link(link), stack(stack_size ? new uint8_t[stack_size] : nullptr),
@@ -81,6 +89,9 @@ Fiber::Fiber(Fiber *link, size_t stack_size) :
Fiber::~Fiber()
{
panic_if(stack && _currentFiber == this, "Fiber stack is in use.");
+#if HAVE_VALGRIND
+ VALGRIND_STACK_DEREGISTER(valgrindStackId);
+#endif
delete [] stack;
}