X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7b7b18bf76328764ba08d088f0b589c2737ffe36..0c956d214e807eec6b3d6d43ebf52d7752f11b1f:/src/kernel/context/ContextThread.cpp diff --git a/src/kernel/context/ContextThread.cpp b/src/kernel/context/ContextThread.cpp index 322d0e1f77..4eac4a52c9 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" @@ -89,9 +89,9 @@ ThreadContext* ThreadContextFactory::create_maestro(std::function code, return this->new_context(std::move(code), nullptr, process, true); } -ThreadContext::ThreadContext(std::function code, - void_pfn_smxprocess_t cleanup, smx_actor_t process, bool maestro) - : AttachContext(std::move(code), cleanup, process) +ThreadContext::ThreadContext(std::function code, void_pfn_smxprocess_t cleanup, smx_actor_t process, + bool maestro) + : AttachContext(std::move(code), cleanup, process), is_maestro_(maestro) { // We do not need the semaphores when maestro is in main, // but creating them anyway simplifies things when maestro is externalized @@ -147,17 +147,18 @@ void *ThreadContext::wrapper(void *param) /* Tell the maestro we are starting, and wait for its green light */ xbt_os_sem_release(context->end_); - xbt_os_sem_acquire(context->begin_); - if (smx_ctx_thread_sem) /* parallel run */ - xbt_os_sem_acquire(smx_ctx_thread_sem); + context->start(); try { (*context)(); - context->stop(); - } catch (StopRequest) { + context->Context::stop(); + } catch (StopRequest const&) { XBT_DEBUG("Caught a StopRequest"); } + // Signal to the maestro that it has finished: + context->yield(); + #ifndef WIN32 stack.ss_flags = SS_DISABLE; sigaltstack(&stack, nullptr); @@ -181,11 +182,11 @@ void *ThreadContext::maestro_wrapper(void *param) xbt_os_sem_release(context->end_); // Wait for the caller to give control back to us: - xbt_os_sem_acquire(context->begin_); + context->start(); (*context)(); // Tell main that we have finished: - xbt_os_sem_release(context->end_); + context->yield(); #ifndef WIN32 stack.ss_flags = SS_DISABLE; @@ -197,30 +198,27 @@ void *ThreadContext::maestro_wrapper(void *param) void ThreadContext::start() { xbt_os_sem_acquire(this->begin_); - if (smx_ctx_thread_sem) /* parallel run */ + if (not is_maestro_ && smx_ctx_thread_sem) /* parallel run */ xbt_os_sem_acquire(smx_ctx_thread_sem); } -void ThreadContext::stop() +void ThreadContext::yield() { - Context::stop(); - if (smx_ctx_thread_sem) + if (not is_maestro_ && smx_ctx_thread_sem) /* parallel run */ xbt_os_sem_release(smx_ctx_thread_sem); - - // Signal to the maestro that it has finished: xbt_os_sem_release(this->end_); +} +void ThreadContext::stop() +{ + Context::stop(); throw StopRequest(); } void ThreadContext::suspend() { - if (smx_ctx_thread_sem) - xbt_os_sem_release(smx_ctx_thread_sem); - xbt_os_sem_release(this->end_); - xbt_os_sem_acquire(this->begin_); - if (smx_ctx_thread_sem) - xbt_os_sem_acquire(smx_ctx_thread_sem); + this->yield(); + this->start(); } void ThreadContext::attach_start() @@ -228,14 +226,14 @@ void ThreadContext::attach_start() // We're breaking the layers here by depending on the upper layer: ThreadContext* maestro = (ThreadContext*) simix_global->maestro_process->context; xbt_os_sem_release(maestro->begin_); + xbt_assert(not this->is_maestro_); this->start(); } void ThreadContext::attach_stop() { - if (smx_ctx_thread_sem) - xbt_os_sem_release(smx_ctx_thread_sem); - xbt_os_sem_release(this->end_); + xbt_assert(not this->is_maestro_); + this->yield(); ThreadContext* maestro = (ThreadContext*) simix_global->maestro_process->context; xbt_os_sem_acquire(maestro->end_);