-class UContext : public Context {
-protected:
- ucontext_t uc_; /* the ucontext that executes the code */
- char *stack_ = nullptr; /* the thread stack */
-public:
- friend UContextFactory;
- UContext(std::function<void()> code,
- void_pfn_smxprocess_t cleanup_func, smx_actor_t process);
- ~UContext() override;
-};
-
-class SerialUContext : public UContext {
-public:
- SerialUContext(std::function<void()> code,
- void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
- : UContext(std::move(code), cleanup_func, process)
- {}
- void stop() override;
- void suspend() override;
- void resume();
-};
-
-class ParallelUContext : public UContext {
-public:
- ParallelUContext(std::function<void()> code,
- void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
- : UContext(std::move(code), cleanup_func, process)
- {}
- void stop() override;
- void suspend() override;
- void resume();
-};
-
-class UContextFactory : public ContextFactory {
-public:
- friend UContext;
- friend SerialUContext;
- friend ParallelUContext;
-
- UContextFactory();
- ~UContextFactory() override;
- Context* create_context(std::function<void()> code,
- void_pfn_smxprocess_t cleanup, smx_actor_t process) override;
- void run_all() override;
-};
-
-XBT_PRIVATE ContextFactory* sysv_factory()
-{
- XBT_VERB("Activating SYSV context factory");
- return new UContextFactory();
-}
-
-UContextFactory::UContextFactory() : ContextFactory("UContextFactory")
-{
- if (SIMIX_context_is_parallel()) {
- sysv_parallel = true;
-#if HAVE_THREAD_CONTEXTS /* To use parallel ucontexts a thread pool is needed */
- int nthreads = SIMIX_context_get_nthreads();
- sysv_parmap = nullptr;
- sysv_workers_context = xbt_new(ParallelUContext*, nthreads);
- sysv_maestro_context = nullptr;
- xbt_os_thread_key_create(&sysv_worker_id_key);
-#else
- THROWF(arg_error, 0, "No thread support for parallel context execution");
-#endif
- } else {
- sysv_parallel = false;
- }
-}
-
-UContextFactory::~UContextFactory()