X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/772b27f677a94b83523c0b44e018f1feb4b558ef..2e60fe3cfd5cf5305888fcca0ae19700d808bb23:/src/kernel/context/ContextSwapped.hpp diff --git a/src/kernel/context/ContextSwapped.hpp b/src/kernel/context/ContextSwapped.hpp index c495b34b70..1b815aa3f4 100644 --- a/src/kernel/context/ContextSwapped.hpp +++ b/src/kernel/context/ContextSwapped.hpp @@ -6,6 +6,7 @@ #ifndef SIMGRID_KERNEL_CONTEXT_SWAPPED_CONTEXT_HPP #define SIMGRID_KERNEL_CONTEXT_SWAPPED_CONTEXT_HPP +#include "src/internal_config.h" // HAVE_SANITIZER_* #include "src/kernel/context/Context.hpp" #include @@ -14,6 +15,16 @@ namespace simgrid { namespace kernel { namespace context { class SwappedContext; +} // namespace context +} // namespace kernel +} // namespace simgrid + +/* Use extern "C" to make sure that this symbol is easy to recognize by name, even on exotic platforms */ +extern "C" XBT_ATTRIB_NORETURN void smx_ctx_wrapper(simgrid::kernel::context::SwappedContext* context); + +namespace simgrid { +namespace kernel { +namespace context { class SwappedContextFactory : public ContextFactory { friend SwappedContext; // Reads whether we are in parallel mode @@ -33,6 +44,8 @@ private: }; class SwappedContext : public Context { + friend void ::smx_ctx_wrapper(simgrid::kernel::context::SwappedContext*); + public: SwappedContext(std::function&& code, smx_actor_t get_actor, SwappedContextFactory* factory); SwappedContext(const SwappedContext&) = delete; @@ -43,19 +56,16 @@ public: virtual void resume(); XBT_ATTRIB_NORETURN void stop() override; - virtual void swap_into(SwappedContext* to) = 0; // Defined in Raw, Boost and UContext subclasses + void swap_into(SwappedContext* to); unsigned char* get_stack() const { return stack_; } // Return the address for the bottom of the stack. Depending on the stack direction it may be the lower or higher // address unsigned char* get_stack_bottom() const { return PTH_STACKGROWTH == -1 ? stack_ + smx_context_stack_size : stack_; } -#if HAVE_SANITIZER_ADDRESS_FIBER_SUPPORT - const void* asan_stack_ = nullptr; - size_t asan_stack_size_ = 0; - SwappedContext* asan_ctx_ = nullptr; - bool asan_stop_ = false; -#endif +protected: + // With ASan, after a context switch, check that the originating context is the expected one (see BoostContext) + void verify_previous_context(const SwappedContext* context) const; private: static thread_local SwappedContext* worker_context_; @@ -66,8 +76,26 @@ private: #if HAVE_VALGRIND_H unsigned int valgrind_stack_id_; #endif +#if HAVE_SANITIZER_ADDRESS_FIBER_SUPPORT + const void* asan_stack_ = nullptr; + size_t asan_stack_size_ = 0; + SwappedContext* asan_ctx_ = nullptr; + bool asan_stop_ = false; +#endif +#if HAVE_SANITIZER_THREAD_FIBER_SUPPORT + void* tsan_fiber_; +#endif + + virtual void swap_into_for_real(SwappedContext* to) = 0; // Defined in Raw, Boost and UContext subclasses }; +inline void SwappedContext::verify_previous_context(XBT_ATTRIB_UNUSED const SwappedContext* context) const +{ +#if HAVE_SANITIZER_ADDRESS_FIBER_SUPPORT + xbt_assert(this->asan_ctx_ == context); +#endif +} + } // namespace context } // namespace kernel } // namespace simgrid