X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dccf1b41e9c7b5a696f01abceaa2779fe65f154f..524de5f4ae0694f650b58ce80c901db748c9fe93:/src/kernel/context/ContextBoost.cpp diff --git a/src/kernel/context/ContextBoost.cpp b/src/kernel/context/ContextBoost.cpp index 8fe39e2538..a88920d898 100644 --- a/src/kernel/context/ContextBoost.cpp +++ b/src/kernel/context/ContextBoost.cpp @@ -62,15 +62,15 @@ BoostContextFactory::BoostContextFactory() { BoostContext::parallel_ = SIMIX_context_is_parallel(); if (BoostContext::parallel_) { -#if !HAVE_THREAD_CONTEXTS - xbt_die("No thread support for parallel context execution"); -#else +#if HAVE_THREAD_CONTEXTS int nthreads = SIMIX_context_get_nthreads(); BoostContext::parmap_ = xbt_parmap_new(nthreads, SIMIX_context_get_parallel_mode()); BoostContext::workers_context_.clear(); BoostContext::workers_context_.resize(nthreads, nullptr); BoostContext::maestro_context_ = nullptr; xbt_os_thread_key_create(&BoostContext::worker_id_key_); +#else + xbt_die("No thread support for parallel context execution"); #endif } } @@ -86,20 +86,18 @@ BoostContextFactory::~BoostContextFactory() #endif } -smx_context_t BoostContextFactory::create_context(std::function code, - void_pfn_smxprocess_t cleanup_func, smx_actor_t process) +smx_context_t BoostContextFactory::create_context(std::function code, void_pfn_smxprocess_t cleanup_func, + smx_actor_t process) { BoostContext* context = nullptr; if (BoostContext::parallel_) #if HAVE_THREAD_CONTEXTS - context = this->new_context( - std::move(code), cleanup_func, process); + context = this->new_context(std::move(code), cleanup_func, process); #else xbt_die("No support for parallel execution"); #endif else - context = this->new_context( - std::move(code), cleanup_func, process); + context = this->new_context(std::move(code), cleanup_func, process); return context; } @@ -120,8 +118,7 @@ void BoostContextFactory::run_all() { if (xbt_dynar_is_empty(simix_global->process_to_run)) return; - smx_actor_t first_process = - xbt_dynar_get_as(simix_global->process_to_run, 0, smx_actor_t); + smx_actor_t first_process = xbt_dynar_get_as(simix_global->process_to_run, 0, smx_actor_t); BoostContext::process_index_ = 1; /* execute the first process */ static_cast(first_process->context)->resume(); @@ -133,7 +130,7 @@ void BoostContextFactory::run_all() static void smx_ctx_boost_wrapper(std::intptr_t arg) { - BoostContext* context = (BoostContext*) arg; + BoostContext* context = (BoostContext*)(arg); (*context)(); context->stop(); } @@ -143,25 +140,24 @@ BoostContext::BoostContext(std::function code, : 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 the user provided a function for the process then use it, otherwise it is the context for maestro */ 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: - #if PTH_STACKGROWTH == -1 - void* stack = (char*) this->stack_ + smx_context_usable_stack_size - 1; - #else +// 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: +#if PTH_STACKGROWTH == -1 + void* stack = static_cast(this->stack_) + smx_context_usable_stack_size - 1; +#else void* stack = this->stack_; - #endif +#endif this->fc_ = boost::context::make_fcontext( stack, smx_context_usable_stack_size, smx_ctx_boost_wrapper); } else { - #if HAVE_BOOST_CONTEXTS == 1 +#if HAVE_BOOST_CONTEXTS == 1 this->fc_ = new boost::context::fcontext_t(); - #endif +#endif if (BoostContext::maestro_context_ == nullptr) BoostContext::maestro_context_ = this; } @@ -170,7 +166,7 @@ BoostContext::BoostContext(std::function code, BoostContext::~BoostContext() { #if HAVE_BOOST_CONTEXTS == 1 - if (!this->stack_) + if (not this->stack_) delete this->fc_; #endif if (this == maestro_context_) @@ -184,13 +180,9 @@ void BoostContext::resume() { SIMIX_context_set_current(this); #if HAVE_BOOST_CONTEXTS == 1 - boost::context::jump_fcontext( - maestro_context_->fc_, this->fc_, - (intptr_t) this); + boost::context::jump_fcontext(maestro_context_->fc_, this->fc_, (intptr_t) this); #else - boost::context::jump_fcontext( - &maestro_context_->fc_, this->fc_, - (intptr_t) this); + boost::context::jump_fcontext(&maestro_context_->fc_, this->fc_, (intptr_t) this); #endif } @@ -198,28 +190,25 @@ void BoostSerialContext::suspend() { /* determine the next context */ BoostSerialContext* next_context = nullptr; - unsigned long int i = process_index_++; + unsigned long int i = process_index_; + process_index_++; if (i < xbt_dynar_length(simix_global->process_to_run)) { /* execute the next process */ XBT_DEBUG("Run next process"); - next_context = static_cast(xbt_dynar_get_as( - simix_global->process_to_run, i, smx_actor_t)->context); - } - else { + next_context = + static_cast(xbt_dynar_get_as(simix_global->process_to_run, i, smx_actor_t)->context); + } else { /* all processes were run, return to maestro */ XBT_DEBUG("No more process to run"); - next_context = static_cast( - maestro_context_); + next_context = static_cast(maestro_context_); } SIMIX_context_set_current((smx_context_t) next_context); - #if HAVE_BOOST_CONTEXTS == 1 - boost::context::jump_fcontext( - this->fc_, next_context->fc_, (intptr_t) next_context); - #else - boost::context::jump_fcontext( - &this->fc_, next_context->fc_, (intptr_t) next_context); - #endif +#if HAVE_BOOST_CONTEXTS == 1 + boost::context::jump_fcontext(this->fc_, next_context->fc_, (intptr_t) next_context); +#else + boost::context::jump_fcontext(&this->fc_, next_context->fc_, (intptr_t) next_context); +#endif } void BoostSerialContext::stop() @@ -234,28 +223,23 @@ void BoostSerialContext::stop() void BoostParallelContext::suspend() { - smx_actor_t next_work = (smx_actor_t) xbt_parmap_next(parmap_); + smx_actor_t next_work = static_cast(xbt_parmap_next(parmap_)); BoostParallelContext* next_context = nullptr; if (next_work != nullptr) { XBT_DEBUG("Run next process"); next_context = static_cast(next_work->context); - } - else { + } else { XBT_DEBUG("No more processes to run"); - uintptr_t worker_id = - (uintptr_t) xbt_os_thread_get_specific(worker_id_key_); - next_context = static_cast( - workers_context_[worker_id]); + 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); + SIMIX_context_set_current(static_cast (next_context)); #if HAVE_BOOST_CONTEXTS == 1 - boost::context::jump_fcontext( - this->fc_, next_context->fc_, (intptr_t)next_context); + boost::context::jump_fcontext(this->fc_, next_context->fc_, (intptr_t)(next_context)); #else - boost::context::jump_fcontext( - &this->fc_, next_context->fc_, (intptr_t)next_context); + boost::context::jump_fcontext(&this->fc_, next_context->fc_, (intptr_t)(next_context)); #endif } @@ -270,17 +254,14 @@ void BoostParallelContext::resume() 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 = - static_cast(SIMIX_context_self()); + BoostParallelContext* worker_context = static_cast(SIMIX_context_self()); workers_context_[worker_id] = worker_context; SIMIX_context_set_current(this); #if HAVE_BOOST_CONTEXTS == 1 - boost::context::jump_fcontext( - worker_context->fc_, this->fc_, (intptr_t) this); + boost::context::jump_fcontext(worker_context->fc_, this->fc_, (intptr_t) this); #else - boost::context::jump_fcontext( - &worker_context->fc_, this->fc_, (intptr_t) this); + boost::context::jump_fcontext(&worker_context->fc_, this->fc_, (intptr_t) this); #endif }