Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Revert "We never use the name of the mailbox"
[simgrid.git] / src / simix / BoostContext.cpp
index f2e5cee..241ecc3 100644 (file)
@@ -8,6 +8,10 @@
 
 #include <cstdint>
 
+#include <functional>
+#include <utility>
+#include <vector>
+
 #include <boost/context/all.hpp>
 
 #include <xbt/log.h>
@@ -25,24 +29,22 @@ namespace simix {
 
 class BoostSerialContext : public BoostContext {
 public:
-  BoostSerialContext(xbt_main_func_t code,
-      int argc, char **argv,
+  BoostSerialContext(std::function<void()> code,
       void_pfn_smxprocess_t cleanup_func,
       smx_process_t process)
-    : BoostContext(code, argc, argv, cleanup_func, process) {}
+    : BoostContext(std::move(code), cleanup_func, process) {}
   void stop() override;
   void suspend() override;
   void resume();
 };
 
-#ifdef CONTEXT_THREADS
+#if HAVE_THREAD_CONTEXTS
 class BoostParallelContext : public BoostContext {
 public:
-  BoostParallelContext(xbt_main_func_t code,
-      int argc, char **argv,
+  BoostParallelContext(std::function<void()> code,
       void_pfn_smxprocess_t cleanup_func,
       smx_process_t process)
-    : BoostContext(code, argc, argv, cleanup_func, process) {}
+    : BoostContext(std::move(code), cleanup_func, process) {}
   void stop() override;
   void suspend() override;
   void resume();
@@ -53,7 +55,7 @@ public:
 
 bool                BoostContext::parallel_        = false;
 xbt_parmap_t        BoostContext::parmap_          = nullptr;
-unsigned long       BoostContext::threads_working_ = 0;
+uintptr_t           BoostContext::threads_working_ = 0;
 xbt_os_thread_key_t BoostContext::worker_id_key_;
 unsigned long       BoostContext::process_index_   = 0;
 BoostContext*       BoostContext::maestro_context_ = nullptr;
@@ -64,7 +66,7 @@ BoostContextFactory::BoostContextFactory()
 {
   BoostContext::parallel_ = SIMIX_context_is_parallel();
   if (BoostContext::parallel_) {
-#ifndef CONTEXT_THREADS
+#if !HAVE_THREAD_CONTEXTS
     xbt_die("No thread support for parallel context execution");
 #else
     int nthreads = SIMIX_context_get_nthreads();
@@ -79,7 +81,7 @@ BoostContextFactory::BoostContextFactory()
 
 BoostContextFactory::~BoostContextFactory()
 {
-#ifdef CONTEXT_THREADS
+#if HAVE_THREAD_CONTEXTS
   if (BoostContext::parmap_) {
     xbt_parmap_destroy(BoostContext::parmap_);
     BoostContext::parmap_ = nullptr;
@@ -88,27 +90,26 @@ BoostContextFactory::~BoostContextFactory()
 #endif
 }
 
-smx_context_t BoostContextFactory::create_context(
-  xbt_main_func_t code, int argc, char ** argv,
+smx_context_t BoostContextFactory::create_context(std::function<void()>  code,
   void_pfn_smxprocess_t cleanup_func, smx_process_t process)
 {
   BoostContext* context = nullptr;
   if (BoostContext::parallel_)
-#ifdef CONTEXT_THREADS
+#if HAVE_THREAD_CONTEXTS
     context = this->new_context<BoostParallelContext>(
-      code, argc, argv, cleanup_func, process);
+      std::move(code), cleanup_func, process);
 #else
     xbt_die("No support for parallel execution");
 #endif
   else
     context = this->new_context<BoostSerialContext>(
-      code, argc, argv, cleanup_func, process);
+      std::move(code), cleanup_func, process);
   return context;
 }
 
 void BoostContextFactory::run_all()
 {
-#ifdef CONTEXT_THREADS
+#if HAVE_THREAD_CONTEXTS
   if (BoostContext::parallel_) {
     BoostContext::threads_working_ = 0;
     xbt_parmap_apply(BoostContext::parmap_,
@@ -139,16 +140,14 @@ static void smx_ctx_boost_wrapper(std::intptr_t arg)
   context->stop();
 }
 
-BoostContext::BoostContext(xbt_main_func_t code,
-    int argc, char **argv,
-    void_pfn_smxprocess_t cleanup_func,
-    smx_process_t process)
-  : Context(code, argc, argv, cleanup_func, process)
+BoostContext::BoostContext(std::function<void()> code,
+    void_pfn_smxprocess_t cleanup_func, smx_process_t process)
+  : Context(std::move(code), cleanup_func, process)
 {
 
   /* if the user provided a function for the process then use it,
      otherwise it is the context for maestro */
-  if (code) {
+  if (has_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:
@@ -162,7 +161,7 @@ BoostContext::BoostContext(xbt_main_func_t code,
                       smx_context_usable_stack_size,
                       smx_ctx_boost_wrapper);
   } else {
-    #if HAVE_BOOST_CONTEXT == 1
+    #if HAVE_BOOST_CONTEXTS == 1
     this->fc_ = new boost::context::fcontext_t();
     #endif
     if (BoostContext::maestro_context_ == nullptr)
@@ -172,7 +171,7 @@ BoostContext::BoostContext(xbt_main_func_t code,
 
 BoostContext::~BoostContext()
 {
-#if HAVE_BOOST_CONTEXT == 1
+#if HAVE_BOOST_CONTEXTS == 1
   if (!this->stack_)
     delete this->fc_;
 #endif
@@ -186,13 +185,13 @@ BoostContext::~BoostContext()
 void BoostContext::resume()
 {
   SIMIX_context_set_current(this);
-#if HAVE_BOOST_CONTEXT == 1
+#if HAVE_BOOST_CONTEXTS == 1
   boost::context::jump_fcontext(
     maestro_context_->fc_, this->fc_,
     (intptr_t) this);
 #else
   boost::context::jump_fcontext(
-    &boost_maestro_context_->fc_, this->fc_,
+    &maestro_context_->fc_, this->fc_,
     (intptr_t) this);
 #endif
 }
@@ -216,7 +215,7 @@ void BoostSerialContext::suspend()
       maestro_context_);
   }
   SIMIX_context_set_current((smx_context_t) next_context);
-  #if HAVE_BOOST_CONTEXT == 1
+  #if HAVE_BOOST_CONTEXTS == 1
   boost::context::jump_fcontext(
     this->fc_, next_context->fc_, (intptr_t) next_context);
   #else
@@ -233,7 +232,7 @@ void BoostSerialContext::stop()
 
 // BoostParallelContext
 
-#ifdef CONTEXT_THREADS
+#if HAVE_THREAD_CONTEXTS
 
 void BoostParallelContext::suspend()
 {
@@ -246,14 +245,14 @@ void BoostParallelContext::suspend()
   }
   else {
     XBT_DEBUG("No more processes to run");
-    unsigned long worker_id =
-      (unsigned long) xbt_os_thread_get_specific(worker_id_key_);
+    uintptr_t worker_id =
+      (uintptr_t) xbt_os_thread_get_specific(worker_id_key_);
     next_context = static_cast<BoostParallelContext*>(
       workers_context_[worker_id]);
   }
 
   SIMIX_context_set_current((smx_context_t) next_context);
-#if HAVE_BOOST_CONTEXT == 1
+#if HAVE_BOOST_CONTEXTS == 1
   boost::context::jump_fcontext(
     this->fc_, next_context->fc_, (intptr_t)next_context);
 #else
@@ -270,7 +269,7 @@ void BoostParallelContext::stop()
 
 void BoostParallelContext::resume()
 {
-  unsigned long worker_id = __sync_fetch_and_add(&threads_working_, 1);
+  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 =
@@ -278,7 +277,7 @@ void BoostParallelContext::resume()
   workers_context_[worker_id] = worker_context;
 
   SIMIX_context_set_current(this);
-#if HAVE_BOOST_CONTEXT == 1
+#if HAVE_BOOST_CONTEXTS == 1
   boost::context::jump_fcontext(
     worker_context->fc_, this->fc_, (intptr_t) this);
 #else
@@ -291,6 +290,7 @@ void BoostParallelContext::resume()
 
 XBT_PRIVATE ContextFactory* boost_factory()
 {
+  XBT_VERB("Using Boost contexts. Welcome to the 21th century.");
   return new BoostContextFactory();
 }