X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8d35ce927dd5951b952d5baa2c898db31b8fcb4c..cb5c0fb6bd81952456a54789b6ad1d570067ae80:/src/kernel/context/ContextSwapped.hpp diff --git a/src/kernel/context/ContextSwapped.hpp b/src/kernel/context/ContextSwapped.hpp index 00d2dba4ff..cabea51f29 100644 --- a/src/kernel/context/ContextSwapped.hpp +++ b/src/kernel/context/ContextSwapped.hpp @@ -45,9 +45,10 @@ public: virtual void swap_into(SwappedContext* to) = 0; // Defined in Raw, Boost and UContext subclasses - unsigned char* get_stack(); - - static thread_local SwappedContext* worker_context_; + 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; @@ -56,7 +57,13 @@ public: 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_; + unsigned char* stack_ = nullptr; // the thread stack SwappedContextFactory& factory_; // for sequential and parallel run_all() @@ -65,6 +72,13 @@ private: #endif }; +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