X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5e3adb6026f929615076da0e5a32dc35a02db573..117bc6048d5a60b7516f35eccfa101707d54c47f:/src/kernel/context/ContextThread.cpp diff --git a/src/kernel/context/ContextThread.cpp b/src/kernel/context/ContextThread.cpp index 8b424d4f13..ebcdfbef65 100644 --- a/src/kernel/context/ContextThread.cpp +++ b/src/kernel/context/ContextThread.cpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2009-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -7,12 +6,12 @@ #include #include +#include "src/internal_config.h" /* loads context system definitions */ +#include "src/simix/smx_private.hpp" +#include "src/xbt_modinter.h" /* prototype of os thread module's init/exit in XBT */ #include "xbt/function_types.h" -#include "src/simix/smx_private.h" -#include "src/internal_config.h" /* loads context system definitions */ #include "xbt/swag.h" #include "xbt/xbt_os_thread.h" -#include "src/xbt_modinter.h" /* prototype of os thread module's init/exit in XBT */ #include "src/kernel/context/ContextThread.hpp" @@ -21,7 +20,8 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context); static xbt_os_sem_t smx_ctx_thread_sem = nullptr; namespace simgrid { -namespace simix { +namespace kernel { +namespace context { XBT_PRIVATE ContextFactory* thread_factory() { @@ -49,18 +49,16 @@ ThreadContextFactory::~ThreadContextFactory() ThreadContext* ThreadContextFactory::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, !code); + return this->new_context(std::move(code), cleanup, process, not code); } void ThreadContextFactory::run_all() { if (smx_ctx_thread_sem == nullptr) { // Serial execution - smx_process_t process; - unsigned int cursor; - xbt_dynar_foreach(simix_global->process_to_run, cursor, process) { + for (smx_actor_t const& process : simix_global->process_to_run) { XBT_DEBUG("Handling %p",process); ThreadContext* context = static_cast(process->context); xbt_os_sem_release(context->begin_); @@ -68,12 +66,10 @@ void ThreadContextFactory::run_all() } } else { // Parallel execution - unsigned int index; - smx_process_t process; - xbt_dynar_foreach(simix_global->process_to_run, index, process) + for (smx_actor_t const& process : simix_global->process_to_run) xbt_os_sem_release(static_cast(process->context)->begin_); - xbt_dynar_foreach(simix_global->process_to_run, index, process) - xbt_os_sem_acquire(static_cast(process->context)->end_); + for (smx_actor_t const& process : simix_global->process_to_run) + xbt_os_sem_acquire(static_cast(process->context)->end_); } } @@ -82,22 +78,23 @@ ThreadContext* ThreadContextFactory::self() return static_cast(xbt_os_thread_get_extra_data()); } -ThreadContext* ThreadContextFactory::attach(void_pfn_smxprocess_t cleanup_func, smx_process_t process) +ThreadContext* ThreadContextFactory::attach(void_pfn_smxprocess_t cleanup_func, smx_actor_t process) { return this->new_context( std::function(), cleanup_func, process, false); } -ThreadContext* ThreadContextFactory::create_maestro(std::function code, smx_process_t process) +ThreadContext* ThreadContextFactory::create_maestro(std::function code, smx_actor_t process) { return this->new_context(std::move(code), nullptr, process, true); } ThreadContext::ThreadContext(std::function code, - void_pfn_smxprocess_t cleanup, smx_process_t process, bool maestro) + void_pfn_smxprocess_t cleanup, smx_actor_t process, bool maestro) : AttachContext(std::move(code), cleanup, process) { - // We do not need the semaphores when maestro is in main, but we create them anyway for simplicity wrt the case where maestro is externalized + // We do not need the semaphores when maestro is in main, + // but creating them anyway simplifies things when maestro is externalized this->begin_ = xbt_os_sem_init(0); this->end_ = xbt_os_sem_init(0); @@ -113,7 +110,7 @@ ThreadContext::ThreadContext(std::function code, * name, but now the name is stored at SIMIX level, so we pass a null */ this->thread_ = xbt_os_thread_create(nullptr, - maestro ? ThreadContext::maestro_wrapper : ThreadContext::wrapper, + maestro ? &ThreadContext::maestro_wrapper : &ThreadContext::wrapper, this, this); /* wait the starting of the newly created process */ xbt_os_sem_acquire(this->end_); @@ -154,9 +151,22 @@ void *ThreadContext::wrapper(void *param) if (smx_ctx_thread_sem) /* parallel run */ xbt_os_sem_acquire(smx_ctx_thread_sem); - (*context)(); - context->stop(); + try { + (*context)(); + context->Context::stop(); + } catch (StopRequest const&) { + XBT_DEBUG("Caught a StopRequest"); + } + if (smx_ctx_thread_sem) + xbt_os_sem_release(smx_ctx_thread_sem); + // Signal to the maestro that it has finished: + xbt_os_sem_release(context->end_); + +#ifndef WIN32 + stack.ss_flags = SS_DISABLE; + sigaltstack(&stack, nullptr); +#endif return nullptr; } @@ -182,6 +192,10 @@ void *ThreadContext::maestro_wrapper(void *param) // Tell main that we have finished: xbt_os_sem_release(context->end_); +#ifndef WIN32 + stack.ss_flags = SS_DISABLE; + sigaltstack(&stack, nullptr); +#endif return nullptr; } @@ -195,13 +209,7 @@ void ThreadContext::start() void ThreadContext::stop() { Context::stop(); - if (smx_ctx_thread_sem) - xbt_os_sem_release(smx_ctx_thread_sem); - - // Signal to the maestro that it has finished: - xbt_os_sem_release(this->end_); - - xbt_os_thread_exit(nullptr); + throw StopRequest(); } void ThreadContext::suspend() @@ -234,5 +242,4 @@ void ThreadContext::attach_stop() xbt_os_thread_set_extra_data(nullptr); } -} -} +}}} // namespace