X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7f0086121716cf77e2c0ee605e0400358ed56609..17c4021b9c816f8b96b2d1eb15ed36eb090c7d9d:/src/kernel/context/ContextThread.cpp diff --git a/src/kernel/context/ContextThread.cpp b/src/kernel/context/ContextThread.cpp index 02b9bca7ad..ebcdfbef65 100644 --- a/src/kernel/context/ContextThread.cpp +++ b/src/kernel/context/ContextThread.cpp @@ -6,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" @@ -151,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; } @@ -196,18 +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_); - -#ifndef WIN32 - stack_t stack = {}; - stack.ss_flags = SS_DISABLE; - sigaltstack(&stack, nullptr); -#endif - xbt_os_thread_exit(nullptr); + throw StopRequest(); } void ThreadContext::suspend()