X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b2fe69328dc3b66ce74894b58f5446514e48d53c..c68caf0f27b0fdde9df0a39857e5a162fc196d85:/src/kernel/context/Context.hpp diff --git a/src/kernel/context/Context.hpp b/src/kernel/context/Context.hpp index 50f140cfbc..0f4a2b0451 100644 --- a/src/kernel/context/Context.hpp +++ b/src/kernel/context/Context.hpp @@ -6,11 +6,15 @@ #ifndef SIMGRID_KERNEL_CONTEXT_CONTEXT_HPP #define SIMGRID_KERNEL_CONTEXT_CONTEXT_HPP +#include "simgrid/forward.h" #include "src/internal_config.h" -#include "src/simix/smx_network_private.hpp" +#include "src/kernel/activity/ActivityImpl.hpp" #include +/* Process creation/destruction callbacks */ +typedef void (*void_pfn_smxprocess_t)(smx_actor_t); + namespace simgrid { namespace kernel { namespace context { @@ -24,35 +28,33 @@ public: virtual ~ContextFactory(); virtual Context* create_context(std::function code, void_pfn_smxprocess_t cleanup, smx_actor_t process) = 0; - // Optional methods for attaching main() as a context: - - /** Creates a context from the current context of execution - * - * This will not work on all implementation of `ContextFactory`. - */ + /** Turn the current thread into a simulation context */ virtual Context* attach(void_pfn_smxprocess_t cleanup_func, smx_actor_t process); + /** Turn the current thread into maestro (the old maestro becomes a regular actor) */ virtual Context* create_maestro(std::function code, smx_actor_t process); virtual void run_all() = 0; - virtual Context* self(); + /** @brief Returns the current context of this thread. */ + Context* self(); std::string const& name() const { return name_; } -private: - void declare_context(void* T, std::size_t size); protected: template T* new_context(Args&&... args) { T* context = new T(std::forward(args)...); - this->declare_context(context, sizeof(T)); + context->declare_context(sizeof(T)); return context; } }; class XBT_PUBLIC Context { + friend ContextFactory; + private: std::function code_; void_pfn_smxprocess_t cleanup_func_ = nullptr; smx_actor_t actor_ = nullptr; + void declare_context(std::size_t size); public: class StopRequest { @@ -145,7 +147,6 @@ XBT_PRIVATE void *SIMIX_context_stack_new(); XBT_PRIVATE void SIMIX_context_stack_delete(void *stack); XBT_PUBLIC void SIMIX_context_set_current(smx_context_t context); -XBT_PRIVATE smx_context_t SIMIX_context_get_current(); XBT_PUBLIC int SIMIX_process_get_maxpid();