X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ee6ffc12bf5523e4d2d2193138c791d991ec0ae4..d66477d0584a740d7e78942eefabc039f467453a:/src/simix/BoostContext.cpp diff --git a/src/simix/BoostContext.cpp b/src/simix/BoostContext.cpp index f2e5ceeeda..241ecc36b7 100644 --- a/src/simix/BoostContext.cpp +++ b/src/simix/BoostContext.cpp @@ -8,6 +8,10 @@ #include +#include +#include +#include + #include #include @@ -25,24 +29,22 @@ namespace simix { class BoostSerialContext : public BoostContext { public: - BoostSerialContext(xbt_main_func_t code, - int argc, char **argv, + BoostSerialContext(std::function code, void_pfn_smxprocess_t cleanup_func, smx_process_t process) - : BoostContext(code, argc, argv, cleanup_func, process) {} + : BoostContext(std::move(code), cleanup_func, process) {} void stop() override; void suspend() override; void resume(); }; -#ifdef CONTEXT_THREADS +#if HAVE_THREAD_CONTEXTS class BoostParallelContext : public BoostContext { public: - BoostParallelContext(xbt_main_func_t code, - int argc, char **argv, + BoostParallelContext(std::function code, void_pfn_smxprocess_t cleanup_func, smx_process_t process) - : BoostContext(code, argc, argv, cleanup_func, process) {} + : BoostContext(std::move(code), cleanup_func, process) {} void stop() override; void suspend() override; void resume(); @@ -53,7 +55,7 @@ public: bool BoostContext::parallel_ = false; xbt_parmap_t BoostContext::parmap_ = nullptr; -unsigned long BoostContext::threads_working_ = 0; +uintptr_t BoostContext::threads_working_ = 0; xbt_os_thread_key_t BoostContext::worker_id_key_; unsigned long BoostContext::process_index_ = 0; BoostContext* BoostContext::maestro_context_ = nullptr; @@ -64,7 +66,7 @@ BoostContextFactory::BoostContextFactory() { BoostContext::parallel_ = SIMIX_context_is_parallel(); if (BoostContext::parallel_) { -#ifndef CONTEXT_THREADS +#if !HAVE_THREAD_CONTEXTS xbt_die("No thread support for parallel context execution"); #else int nthreads = SIMIX_context_get_nthreads(); @@ -79,7 +81,7 @@ BoostContextFactory::BoostContextFactory() BoostContextFactory::~BoostContextFactory() { -#ifdef CONTEXT_THREADS +#if HAVE_THREAD_CONTEXTS if (BoostContext::parmap_) { xbt_parmap_destroy(BoostContext::parmap_); BoostContext::parmap_ = nullptr; @@ -88,27 +90,26 @@ BoostContextFactory::~BoostContextFactory() #endif } -smx_context_t BoostContextFactory::create_context( - xbt_main_func_t code, int argc, char ** argv, +smx_context_t BoostContextFactory::create_context(std::function code, void_pfn_smxprocess_t cleanup_func, smx_process_t process) { BoostContext* context = nullptr; if (BoostContext::parallel_) -#ifdef CONTEXT_THREADS +#if HAVE_THREAD_CONTEXTS context = this->new_context( - code, argc, argv, cleanup_func, process); + std::move(code), cleanup_func, process); #else xbt_die("No support for parallel execution"); #endif else context = this->new_context( - code, argc, argv, cleanup_func, process); + std::move(code), cleanup_func, process); return context; } void BoostContextFactory::run_all() { -#ifdef CONTEXT_THREADS +#if HAVE_THREAD_CONTEXTS if (BoostContext::parallel_) { BoostContext::threads_working_ = 0; xbt_parmap_apply(BoostContext::parmap_, @@ -139,16 +140,14 @@ static void smx_ctx_boost_wrapper(std::intptr_t arg) context->stop(); } -BoostContext::BoostContext(xbt_main_func_t code, - int argc, char **argv, - void_pfn_smxprocess_t cleanup_func, - smx_process_t process) - : Context(code, argc, argv, cleanup_func, process) +BoostContext::BoostContext(std::function code, + void_pfn_smxprocess_t cleanup_func, smx_process_t process) + : Context(std::move(code), cleanup_func, process) { /* if the user provided a function for the process then use it, otherwise it is the context for maestro */ - if (code) { + if (has_code()) { this->stack_ = SIMIX_context_stack_new(); // We need to pass the bottom of the stack to make_fcontext, // depending on the stack direction it may be the lower or higher address: @@ -162,7 +161,7 @@ BoostContext::BoostContext(xbt_main_func_t code, smx_context_usable_stack_size, smx_ctx_boost_wrapper); } else { - #if HAVE_BOOST_CONTEXT == 1 + #if HAVE_BOOST_CONTEXTS == 1 this->fc_ = new boost::context::fcontext_t(); #endif if (BoostContext::maestro_context_ == nullptr) @@ -172,7 +171,7 @@ BoostContext::BoostContext(xbt_main_func_t code, BoostContext::~BoostContext() { -#if HAVE_BOOST_CONTEXT == 1 +#if HAVE_BOOST_CONTEXTS == 1 if (!this->stack_) delete this->fc_; #endif @@ -186,13 +185,13 @@ BoostContext::~BoostContext() void BoostContext::resume() { SIMIX_context_set_current(this); -#if HAVE_BOOST_CONTEXT == 1 +#if HAVE_BOOST_CONTEXTS == 1 boost::context::jump_fcontext( maestro_context_->fc_, this->fc_, (intptr_t) this); #else boost::context::jump_fcontext( - &boost_maestro_context_->fc_, this->fc_, + &maestro_context_->fc_, this->fc_, (intptr_t) this); #endif } @@ -216,7 +215,7 @@ void BoostSerialContext::suspend() maestro_context_); } SIMIX_context_set_current((smx_context_t) next_context); - #if HAVE_BOOST_CONTEXT == 1 + #if HAVE_BOOST_CONTEXTS == 1 boost::context::jump_fcontext( this->fc_, next_context->fc_, (intptr_t) next_context); #else @@ -233,7 +232,7 @@ void BoostSerialContext::stop() // BoostParallelContext -#ifdef CONTEXT_THREADS +#if HAVE_THREAD_CONTEXTS void BoostParallelContext::suspend() { @@ -246,14 +245,14 @@ void BoostParallelContext::suspend() } else { XBT_DEBUG("No more processes to run"); - unsigned long worker_id = - (unsigned long) xbt_os_thread_get_specific(worker_id_key_); + uintptr_t worker_id = + (uintptr_t) xbt_os_thread_get_specific(worker_id_key_); next_context = static_cast( workers_context_[worker_id]); } SIMIX_context_set_current((smx_context_t) next_context); -#if HAVE_BOOST_CONTEXT == 1 +#if HAVE_BOOST_CONTEXTS == 1 boost::context::jump_fcontext( this->fc_, next_context->fc_, (intptr_t)next_context); #else @@ -270,7 +269,7 @@ void BoostParallelContext::stop() void BoostParallelContext::resume() { - unsigned long worker_id = __sync_fetch_and_add(&threads_working_, 1); + uintptr_t worker_id = __sync_fetch_and_add(&threads_working_, 1); xbt_os_thread_set_specific(worker_id_key_, (void*) worker_id); BoostParallelContext* worker_context = @@ -278,7 +277,7 @@ void BoostParallelContext::resume() workers_context_[worker_id] = worker_context; SIMIX_context_set_current(this); -#if HAVE_BOOST_CONTEXT == 1 +#if HAVE_BOOST_CONTEXTS == 1 boost::context::jump_fcontext( worker_context->fc_, this->fc_, (intptr_t) this); #else @@ -291,6 +290,7 @@ void BoostParallelContext::resume() XBT_PRIVATE ContextFactory* boost_factory() { + XBT_VERB("Using Boost contexts. Welcome to the 21th century."); return new BoostContextFactory(); }