X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/55092bf3f9fe1cccfe72f7ef81fcd51f9a0eb4ca..35e51746af39c4061a0336771f8f31bb371fae23:/src/kernel/context/ContextRaw.cpp diff --git a/src/kernel/context/ContextRaw.cpp b/src/kernel/context/ContextRaw.cpp index 6e13140533..a49ead0b27 100644 --- a/src/kernel/context/ContextRaw.cpp +++ b/src/kernel/context/ContextRaw.cpp @@ -43,7 +43,7 @@ public: friend class RawContextFactory; RawContext(std::function code, void_pfn_smxprocess_t cleanup_func, - smx_process_t process); + smx_actor_t process); ~RawContext() override; public: static void wrapper(void* arg); @@ -62,7 +62,7 @@ public: RawContextFactory(); ~RawContextFactory() override; RawContext* create_context(std::function code, - void_pfn_smxprocess_t cleanup, smx_process_t process) override; + void_pfn_smxprocess_t cleanup, smx_actor_t process) override; void run_all() override; private: void run_all_adaptative(); @@ -292,21 +292,20 @@ RawContextFactory::~RawContextFactory() } RawContext* RawContextFactory::create_context(std::function code, - void_pfn_smxprocess_t cleanup, smx_process_t process) + void_pfn_smxprocess_t cleanup, smx_actor_t process) { - return this->new_context(std::move(code), - cleanup, process); + return this->new_context(std::move(code), cleanup, process); } void RawContext::wrapper(void* arg) { - RawContext* context = (RawContext*) arg; + RawContext* context = static_cast(arg); (*context)(); context->stop(); } RawContext::RawContext(std::function code, - void_pfn_smxprocess_t cleanup, smx_process_t process) + void_pfn_smxprocess_t cleanup, smx_actor_t process) : Context(std::move(code), cleanup, process) { if (has_code()) { @@ -346,8 +345,11 @@ void RawContextFactory::run_all() void RawContextFactory::run_all_serial() { - smx_process_t first_process = - xbt_dynar_get_as(simix_global->process_to_run, 0, smx_process_t); + 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); raw_process_index = 1; static_cast(first_process->context)->resume_serial(); } @@ -361,7 +363,7 @@ void RawContextFactory::run_all_parallel() SIMIX_context_get_nthreads(), SIMIX_context_get_parallel_mode()); xbt_parmap_apply(raw_parmap, [](void* arg) { - smx_process_t process = static_cast(arg); + smx_actor_t process = static_cast(arg); RawContext* context = static_cast(process->context); context->resume_parallel(); }, @@ -383,18 +385,16 @@ void RawContext::suspend_serial() { /* determine the next context */ RawContext* next_context = nullptr; - unsigned long int i; - i = raw_process_index++; + unsigned long int i = raw_process_index; + raw_process_index++; if (i < xbt_dynar_length(simix_global->process_to_run)) { /* execute the next process */ XBT_DEBUG("Run next process"); - next_context = (RawContext*) xbt_dynar_get_as( - simix_global->process_to_run, i, smx_process_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 = (RawContext*) raw_maestro_context; + next_context = static_cast(raw_maestro_context); } SIMIX_context_set_current(next_context); raw_swapcontext(&this->stack_top_, next_context->stack_top_); @@ -404,20 +404,19 @@ void RawContext::suspend_parallel() { #if HAVE_THREAD_CONTEXTS /* determine the next context */ - smx_process_t next_work = (smx_process_t) xbt_parmap_next(raw_parmap); + smx_actor_t next_work = static_cast(xbt_parmap_next(raw_parmap)); RawContext* next_context = nullptr; if (next_work != nullptr) { /* there is a next process to resume */ XBT_DEBUG("Run next process"); - next_context = (RawContext*) next_work->context; - } - else { + next_context = static_cast(next_work->context); + } else { /* all processes were run, go to the barrier */ XBT_DEBUG("No more processes to run"); uintptr_t worker_id = (uintptr_t) xbt_os_thread_get_specific(raw_worker_id_key); - next_context = (RawContext*) raw_workers_context[worker_id]; + next_context = static_cast(raw_workers_context[worker_id]); XBT_DEBUG("Restoring worker stack %zu (working threads = %zu)", worker_id, raw_threads_working); } @@ -446,7 +445,7 @@ void RawContext::resume_parallel() #if HAVE_THREAD_CONTEXTS uintptr_t worker_id = __sync_fetch_and_add(&raw_threads_working, 1); xbt_os_thread_set_specific(raw_worker_id_key, (void*) worker_id); - RawContext* worker_context = (RawContext*) SIMIX_context_self(); + RawContext* worker_context = static_cast(SIMIX_context_self()); raw_workers_context[worker_id] = worker_context; XBT_DEBUG("Saving worker stack %zu", worker_id); SIMIX_context_set_current(this); @@ -460,16 +459,16 @@ void RawContext::resume_parallel() void RawContextFactory::run_all_adaptative() { unsigned long nb_processes = xbt_dynar_length(simix_global->process_to_run); - if (SIMIX_context_is_parallel() - && (unsigned long) SIMIX_context_get_parallel_threshold() < nb_processes) { - raw_context_parallel = true; - XBT_DEBUG("Runall // %lu", nb_processes); - this->run_all_parallel(); - } else { - XBT_DEBUG("Runall serial %lu", nb_processes); - raw_context_parallel = false; - this->run_all_serial(); - } + if (SIMIX_context_is_parallel() && + static_cast(SIMIX_context_get_parallel_threshold()) < nb_processes) { + raw_context_parallel = true; + XBT_DEBUG("Runall // %lu", nb_processes); + this->run_all_parallel(); + } else { + XBT_DEBUG("Runall serial %lu", nb_processes); + raw_context_parallel = false; + this->run_all_serial(); + } } }}}