diff options
-rwxr-xr-x | SConstruct | 8 | ||||
-rw-r--r-- | src/base/fiber.cc | 13 | ||||
-rw-r--r-- | src/base/fiber.hh | 5 |
3 files changed, 23 insertions, 3 deletions
diff --git a/SConstruct b/SConstruct index 5209aa6d4..79522e46f 100755 --- a/SConstruct +++ b/SConstruct @@ -783,6 +783,10 @@ main['HAVE_PROTOBUF'] = main['PROTOC'] and \ conf.CheckLibWithHeader('protobuf', 'google/protobuf/message.h', 'C++', 'GOOGLE_PROTOBUF_VERIFY_VERSION;') +# Valgrind gets much less confused if you tell it when you're using +# alternative stacks. +main['HAVE_VALGRIND'] = conf.CheckCHeader('valgrind/valgrind.h') + # If we have the compiler but not the library, print another warning. if main['PROTOC'] and not main['HAVE_PROTOBUF']: print(termcap.Yellow + termcap.Bold + @@ -1012,8 +1016,8 @@ sticky_vars.AddVariables( # These variables get exported to #defines in config/*.hh (see src/SConscript). export_vars += ['USE_FENV', 'SS_COMPATIBLE_FP', 'TARGET_ISA', 'TARGET_GPU_ISA', 'CP_ANNOTATE', 'USE_POSIX_CLOCK', 'USE_KVM', 'USE_TUNTAP', - 'PROTOCOL', 'HAVE_PROTOBUF', 'HAVE_PERF_ATTR_EXCLUDE_HOST', - 'USE_PNG'] + 'PROTOCOL', 'HAVE_PROTOBUF', 'HAVE_VALGRIND', + 'HAVE_PERF_ATTR_EXCLUDE_HOST', 'USE_PNG'] ################################################### # 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; } diff --git a/src/base/fiber.hh b/src/base/fiber.hh index 5f7285b29..3d82075f0 100644 --- a/src/base/fiber.hh +++ b/src/base/fiber.hh @@ -44,6 +44,8 @@ #include <cstddef> #include <cstdint> +#include "config/have_valgrind.hh" + /** * This class represents a fiber, which is a light weight sort of thread which * is cooperatively scheduled and runs sequentially with other fibers, swapping @@ -106,6 +108,9 @@ class Fiber // The stack for this context, or a nullptr if allocated elsewhere. uint8_t *stack; size_t stackSize; +#if HAVE_VALGRIND + unsigned valgrindStackId; +#endif bool started; bool _finished; |