Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Define and use SwappedContext::verify_previous_context().
[simgrid.git] / src / kernel / context / ContextSwapped.hpp
index 5e526ce..cabea51 100644 (file)
@@ -41,13 +41,14 @@ public:
 
   void suspend() override;
   virtual void resume();
-  void stop() override;
+  XBT_ATTRIB_NORETURN void stop() override;
 
   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,15 +57,28 @@ 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:
-  unsigned char* stack_ = nullptr;       /* the thread stack */
-  SwappedContextFactory* const factory_; // for sequential and parallel run_all()
+  static thread_local SwappedContext* worker_context_;
+
+  unsigned char* stack_ = nullptr; // the thread stack
+  SwappedContextFactory& factory_; // for sequential and parallel run_all()
 
 #if HAVE_VALGRIND_H
   unsigned int valgrind_stack_id_;
 #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