namespace kernel {
namespace context {
-class BoostContext;
-class SerialBoostContext;
-class ParallelBoostContext;
-class BoostContextFactory;
-
/** @brief Userspace context switching implementation based on Boost.Context */
class BoostContext : public Context {
-protected: // static
- static bool parallel_;
- static simgrid::xbt::Parmap<smx_actor_t>* parmap_;
- static std::vector<BoostContext*> workers_context_;
- static uintptr_t threads_working_;
- static xbt_os_thread_key_t worker_id_key_;
- static unsigned long process_index_;
+public:
+ BoostContext(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t process);
+ ~BoostContext() override;
+ void stop() override;
+ virtual void resume() = 0;
+
+ static void swap(BoostContext* from, BoostContext* to);
+ static BoostContext* getMaestro() { return maestro_context_; }
+ static void setMaestro(BoostContext* maestro) { maestro_context_ = maestro; }
+
+private:
static BoostContext* maestro_context_;
+ void* stack_ = nullptr;
#if BOOST_VERSION < 105600
boost::context::fcontext_t* fc_ = nullptr;
boost::context::detail::fcontext_t fc_;
typedef boost::context::detail::transfer_t arg_type;
#endif
- static void wrapper(arg_type arg);
- static void swap(BoostContext* from, BoostContext* to);
-
#if HAVE_SANITIZE_ADDRESS_FIBER_SUPPORT
const void* asan_stack_ = nullptr;
size_t asan_stack_size_ = 0;
bool asan_stop_ = false;
#endif
- void* stack_ = nullptr;
-public:
- BoostContext(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t process);
- ~BoostContext() override;
- void stop() override;
- virtual void resume() = 0;
-
- friend BoostContextFactory;
+ static void wrapper(arg_type arg);
};
class SerialBoostContext : public BoostContext {
}
void suspend() override;
void resume() override;
+
+ static void run_all();
+
+private:
+ static unsigned long process_index_;
};
#if HAVE_THREAD_CONTEXTS
}
void suspend() override;
void resume() override;
+
+ static void initialize();
+ static void finalize();
+ static void run_all();
+
+private:
+ static simgrid::xbt::Parmap<smx_actor_t>* parmap_;
+ static std::vector<ParallelBoostContext*> workers_context_;
+ static uintptr_t threads_working_;
+ static xbt_os_thread_key_t worker_id_key_;
};
#endif
~BoostContextFactory() override;
Context* create_context(std::function<void()> code, void_pfn_smxprocess_t, smx_actor_t process) override;
void run_all() override;
+
+private:
+ bool parallel_;
};
}}} // namespace