From: Arnaud Giersch Date: Mon, 23 Oct 2017 19:23:13 +0000 (+0200) Subject: ThreadContext: define yield(), and use yield()/start() whenever possible. X-Git-Tag: v3.18~397^2~21 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/0c956d214e807eec6b3d6d43ebf52d7752f11b1f?ds=sidebyside ThreadContext: define yield(), and use yield()/start() whenever possible. --- diff --git a/src/kernel/context/ContextThread.cpp b/src/kernel/context/ContextThread.cpp index ebcdfbef65..4eac4a52c9 100644 --- a/src/kernel/context/ContextThread.cpp +++ b/src/kernel/context/ContextThread.cpp @@ -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,9 +147,7 @@ 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)(); @@ -158,10 +156,8 @@ void *ThreadContext::wrapper(void *param) 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_); + context->yield(); #ifndef WIN32 stack.ss_flags = SS_DISABLE; @@ -186,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; @@ -202,10 +198,17 @@ 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::yield() +{ + if (not is_maestro_ && smx_ctx_thread_sem) /* parallel run */ + xbt_os_sem_release(smx_ctx_thread_sem); + xbt_os_sem_release(this->end_); +} + void ThreadContext::stop() { Context::stop(); @@ -214,12 +217,8 @@ void ThreadContext::stop() 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() @@ -227,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_); diff --git a/src/kernel/context/ContextThread.hpp b/src/kernel/context/ContextThread.hpp index 3449f88a59..62d8191257 100644 --- a/src/kernel/context/ContextThread.hpp +++ b/src/kernel/context/ContextThread.hpp @@ -22,9 +22,7 @@ class ThreadContextFactory; class ThreadContext : public AttachContext { public: friend ThreadContextFactory; - ThreadContext(std::function code, - void_pfn_smxprocess_t cleanup_func, - smx_actor_t process, bool maestro =false); + ThreadContext(std::function code, void_pfn_smxprocess_t cleanup_func, smx_actor_t process, bool maestro); ~ThreadContext() override; void stop() override; void suspend() override; @@ -37,11 +35,13 @@ private: xbt_os_sem_t begin_ = nullptr; /** Semaphore used to schedule/unschedule */ xbt_os_sem_t end_ = nullptr; + bool is_maestro_; static void* wrapper(void *param); static void* maestro_wrapper(void *param); public: void start(); + void yield(); }; class ThreadContextFactory : public ContextFactory {