Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
please sonar
[simgrid.git] / src / kernel / context / ContextBoost.cpp
index 17fd4c8..051dc6f 100644 (file)
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
 
 namespace simgrid {
-namespace simix {
+namespace kernel {
+namespace context {
 
 class BoostSerialContext : public BoostContext {
 public:
   BoostSerialContext(std::function<void()> code,
       void_pfn_smxprocess_t cleanup_func,
-      smx_process_t process)
+      smx_actor_t process)
     : BoostContext(std::move(code), cleanup_func, process) {}
   void stop() override;
   void suspend() override;
@@ -38,7 +39,7 @@ class BoostParallelContext : public BoostContext {
 public:
   BoostParallelContext(std::function<void()> code,
       void_pfn_smxprocess_t cleanup_func,
-      smx_process_t process)
+      smx_actor_t process)
     : BoostContext(std::move(code), cleanup_func, process) {}
   void stop() override;
   void suspend() override;
@@ -86,19 +87,17 @@ BoostContextFactory::~BoostContextFactory()
 }
 
 smx_context_t BoostContextFactory::create_context(std::function<void()>  code,
-  void_pfn_smxprocess_t cleanup_func, smx_process_t process)
+  void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
 {
   BoostContext* context = nullptr;
   if (BoostContext::parallel_)
 #if HAVE_THREAD_CONTEXTS
-    context = this->new_context<BoostParallelContext>(
-      std::move(code), cleanup_func, process);
+    context = this->new_context<BoostParallelContext>(std::move(code), cleanup_func, process);
 #else
     xbt_die("No support for parallel execution");
 #endif
   else
-    context = this->new_context<BoostSerialContext>(
-      std::move(code), cleanup_func, process);
+    context = this->new_context<BoostSerialContext>(std::move(code), cleanup_func, process);
   return context;
 }
 
@@ -109,7 +108,7 @@ void BoostContextFactory::run_all()
     BoostContext::threads_working_ = 0;
     xbt_parmap_apply(BoostContext::parmap_,
       [](void* arg) {
-        smx_process_t process = static_cast<smx_process_t>(arg);
+        smx_actor_t process = static_cast<smx_actor_t>(arg);
         BoostContext* context  = static_cast<BoostContext*>(process->context);
         return context->resume();
       },
@@ -117,8 +116,9 @@ void BoostContextFactory::run_all()
   } else
 #endif
   {
-    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);
     BoostContext::process_index_ = 1;
     /* execute the first process */
     static_cast<BoostContext*>(first_process->context)->resume();
@@ -130,13 +130,13 @@ void BoostContextFactory::run_all()
 
 static void smx_ctx_boost_wrapper(std::intptr_t arg)
 {
-  BoostContext* context = (BoostContext*) arg;
+  BoostContext* context = (BoostContext*)(arg);
   (*context)();
   context->stop();
 }
 
 BoostContext::BoostContext(std::function<void()> code,
-    void_pfn_smxprocess_t cleanup_func, smx_process_t process)
+    void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
   : Context(std::move(code), cleanup_func, process)
 {
 
@@ -146,19 +146,19 @@ BoostContext::BoostContext(std::function<void()> code,
     this->stack_ = SIMIX_context_stack_new();
     // We need to pass the bottom of the stack to make_fcontext,
     // depending on the stack direction it may be the lower or higher address:
-  #if PTH_STACKGROWTH == -1
-    void* stack = (char*) this->stack_ + smx_context_usable_stack_size - 1;
-  #else
+#if PTH_STACKGROWTH == -1
+    void* stack = static_cast<char*>(this->stack_) + smx_context_usable_stack_size - 1;
+#else
     void* stack = this->stack_;
-  #endif
+#endif
     this->fc_ = boost::context::make_fcontext(
                       stack,
                       smx_context_usable_stack_size,
                       smx_ctx_boost_wrapper);
   } else {
-    #if HAVE_BOOST_CONTEXTS == 1
+#if HAVE_BOOST_CONTEXTS == 1
     this->fc_ = new boost::context::fcontext_t();
-    #endif
+#endif
     if (BoostContext::maestro_context_ == nullptr)
       BoostContext::maestro_context_ = this;
   }
@@ -181,13 +181,9 @@ void BoostContext::resume()
 {
   SIMIX_context_set_current(this);
 #if HAVE_BOOST_CONTEXTS == 1
-  boost::context::jump_fcontext(
-    maestro_context_->fc_, this->fc_,
-    (intptr_t) this);
+  boost::context::jump_fcontext(maestro_context_->fc_, this->fc_, (intptr_t) this);
 #else
-  boost::context::jump_fcontext(
-    &maestro_context_->fc_, this->fc_,
-    (intptr_t) this);
+  boost::context::jump_fcontext(&maestro_context_->fc_, this->fc_, (intptr_t) this);
 #endif
 }
 
@@ -201,22 +197,19 @@ void BoostSerialContext::suspend()
     /* execute the next process */
     XBT_DEBUG("Run next process");
     next_context = static_cast<BoostSerialContext*>(xbt_dynar_get_as(
-        simix_global->process_to_run, i, smx_process_t)->context);
+        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 = static_cast<BoostSerialContext*>(
-      maestro_context_);
+    next_context = static_cast<BoostSerialContext*>(maestro_context_);
   }
   SIMIX_context_set_current((smx_context_t) next_context);
-  #if HAVE_BOOST_CONTEXTS == 1
-  boost::context::jump_fcontext(
-    this->fc_, next_context->fc_, (intptr_t) next_context);
-  #else
-  boost::context::jump_fcontext(
-    &this->fc_, next_context->fc_, (intptr_t) next_context);
-  #endif
+#if HAVE_BOOST_CONTEXTS == 1
+  boost::context::jump_fcontext(this->fc_, next_context->fc_, (intptr_t) next_context);
+#else
+  boost::context::jump_fcontext(&this->fc_, next_context->fc_, (intptr_t) next_context);
+#endif
 }
 
 void BoostSerialContext::stop()
@@ -231,7 +224,7 @@ void BoostSerialContext::stop()
 
 void BoostParallelContext::suspend()
 {
-  smx_process_t next_work = (smx_process_t) xbt_parmap_next(parmap_);
+  smx_actor_t next_work = static_cast<smx_actor_t>(xbt_parmap_next(parmap_));
   BoostParallelContext* next_context = nullptr;
 
   if (next_work != nullptr) {
@@ -242,17 +235,14 @@ void BoostParallelContext::suspend()
     XBT_DEBUG("No more processes to run");
     uintptr_t worker_id =
       (uintptr_t) xbt_os_thread_get_specific(worker_id_key_);
-    next_context = static_cast<BoostParallelContext*>(
-      workers_context_[worker_id]);
+    next_context = static_cast<BoostParallelContext*>(workers_context_[worker_id]);
   }
 
-  SIMIX_context_set_current((smx_context_t) next_context);
+  SIMIX_context_set_current(static_cast<smx_context_t> (next_context));
 #if HAVE_BOOST_CONTEXTS == 1
-  boost::context::jump_fcontext(
-    this->fc_, next_context->fc_, (intptr_t)next_context);
+  boost::context::jump_fcontext(this->fc_, next_context->fc_, (intptr_t)(next_context));
 #else
-  boost::context::jump_fcontext(
-    &this->fc_, next_context->fc_, (intptr_t)next_context);
+  boost::context::jump_fcontext(&this->fc_, next_context->fc_, (intptr_t)(next_context));
 #endif
 }
 
@@ -267,17 +257,14 @@ void BoostParallelContext::resume()
   uintptr_t worker_id = __sync_fetch_and_add(&threads_working_, 1);
   xbt_os_thread_set_specific(worker_id_key_, (void*) worker_id);
 
-  BoostParallelContext* worker_context =
-    static_cast<BoostParallelContext*>(SIMIX_context_self());
+  BoostParallelContext* worker_context = static_cast<BoostParallelContext*>(SIMIX_context_self());
   workers_context_[worker_id] = worker_context;
 
   SIMIX_context_set_current(this);
 #if HAVE_BOOST_CONTEXTS == 1
-  boost::context::jump_fcontext(
-    worker_context->fc_, this->fc_, (intptr_t) this);
+  boost::context::jump_fcontext(worker_context->fc_, this->fc_, (intptr_t) this);
 #else
-  boost::context::jump_fcontext(
-    &worker_context->fc_, this->fc_, (intptr_t) this);
+  boost::context::jump_fcontext(&worker_context->fc_, this->fc_, (intptr_t) this);
 #endif
 }
 
@@ -289,5 +276,4 @@ XBT_PRIVATE ContextFactory* boost_factory()
   return new BoostContextFactory();
 }
 
-}
-}
+}}} // namespace