Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
very preliminary cleanups in the contextes
[simgrid.git] / src / simix / smx_context.cpp
index 7607f84..148f66e 100644 (file)
@@ -6,18 +6,22 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include <cerrno>
+#include <cstring>
+
 #include <utility>
 #include <string>
 
 #include <xbt/config.hpp>
+#include <xbt/log.h>
 #include <xbt/range.hpp>
+#include <xbt/sysdep.h>
 
 #include "src/internal_config.h"
 #include "xbt/log.h"
 #include "xbt/swag.h"
 #include "xbt/xbt_os_thread.h"
 #include "smx_private.h"
-#include "smx_private.hpp"
 #include "simgrid/sg_config.h"
 #include "src/internal_config.h"
 #include "simgrid/modelchecker.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_context, simix, "Context switching mechanism");
 
-static std::pair<const char*, simgrid::simix::ContextFactoryInitializer> context_factories[] = {
+static std::pair<const char*, simgrid::kernel::context::ContextFactoryInitializer> context_factories[] = {
 #if HAVE_RAW_CONTEXTS
-  { "raw", simgrid::simix::raw_factory },
+  { "raw", &simgrid::kernel::context::raw_factory },
 #endif
 #if HAVE_UCONTEXT_CONTEXTS
-  { "ucontext", simgrid::simix::sysv_factory },
+  { "ucontext", &simgrid::kernel::context::sysv_factory },
 #endif
 #if HAVE_BOOST_CONTEXTS
-  { "boost", simgrid::simix::boost_factory },
+  { "boost", &simgrid::kernel::context::boost_factory },
 #endif
 #if HAVE_THREAD_CONTEXTS
-  { "thread", simgrid::simix::thread_factory },
+  { "thread", &simgrid::kernel::context::thread_factory },
 #endif
 };
 
-static_assert(sizeof(context_factories) != 0,
-  "No context factories are enabled for this build");
+static_assert(sizeof(context_factories) != 0, "No context factories are enabled for this build");
 
 // Create the list of possible contexts:
 static inline
@@ -91,44 +94,22 @@ static int smx_parallel_contexts = 1;
 static int smx_parallel_threshold = 2;
 static e_xbt_parmap_mode_t smx_parallel_synchronization_mode = XBT_PARMAP_DEFAULT;
 
-static inline
-void invalid_context_factory()
-{
-  XBT_ERROR("Invalid context factory specified. Valid factories on this machine:");
-#if HAVE_RAW_CONTEXTS
-  XBT_ERROR("  raw: high performance context factory implemented specifically for SimGrid");
-#else
-  XBT_ERROR("  (raw contexts were disabled at compilation time on this machine -- check configure logs for details)");
-#endif
-#if HAVE_UCONTEXT_CONTEXTS
-  XBT_ERROR("  ucontext: classical system V contexts (implemented with makecontext, swapcontext and friends)");
-#else
-  XBT_ERROR("  (ucontext was disabled at compilation time on this machine -- check configure logs for details)");
-#endif
-#if HAVE_BOOST_CONTEXTS
-  XBT_ERROR("  boost: this uses the boost libraries context implementation");
-#else
-  XBT_ERROR("  (boost was disabled at compilation time on this machine -- check configure logs for details. Did you install the libboost-context-dev package?)");
-#endif
-  XBT_ERROR("  thread: slow portability layer using pthreads as provided by gcc");
-  xbt_die("Please use a valid factory.");
-}
-
 /**
  * This function is called by SIMIX_global_init() to initialize the context module.
  */
 void SIMIX_context_mod_init(void)
 {
+  xbt_assert(simix_global->context_factory == nullptr);
+
 #if HAVE_THREAD_CONTEXTS && !HAVE_THREAD_LOCAL_STORAGE
   /* the __thread storage class is not available on this platform:
    * use getspecific/setspecific instead to store the current context in each thread */
   xbt_os_thread_key_create(&smx_current_context_key);
 #endif
-  if (simix_global->context_factory)
-    return;
+
   /* select the context factory to use to create the contexts */
-  if (simgrid::simix::factory_initializer) {
-    simix_global->context_factory = simgrid::simix::factory_initializer();
+  if (simgrid::kernel::context::factory_initializer) { // Give Java a chance to hijack the factory mechanism
+    simix_global->context_factory = simgrid::kernel::context::factory_initializer();
     return;
   }
   /* use the factory specified by --cfg=contexts/factory:value */
@@ -137,8 +118,27 @@ void SIMIX_context_mod_init(void)
       simix_global->context_factory = factory.second();
       break;
     }
-  if (simix_global->context_factory == nullptr)
-    invalid_context_factory();
+
+  if (simix_global->context_factory == nullptr) {
+    XBT_ERROR("Invalid context factory specified. Valid factories on this machine:");
+#if HAVE_RAW_CONTEXTS
+    XBT_ERROR("  raw: high performance context factory implemented specifically for SimGrid");
+#else
+    XBT_ERROR("  (raw contexts were disabled at compilation time on this machine -- check configure logs for details)");
+#endif
+#if HAVE_UCONTEXT_CONTEXTS
+    XBT_ERROR("  ucontext: classical system V contexts (implemented with makecontext, swapcontext and friends)");
+#else
+    XBT_ERROR("  (ucontext was disabled at compilation time on this machine -- check configure logs for details)");
+#endif
+#if HAVE_BOOST_CONTEXTS
+    XBT_ERROR("  boost: this uses the boost libraries context implementation");
+#else
+    XBT_ERROR("  (boost was disabled at compilation time on this machine -- check configure logs for details. Did you install the libboost-context-dev package?)");
+#endif
+    XBT_ERROR("  thread: slow portability layer using pthreads as provided by gcc");
+    xbt_die("Please use a valid factory.");
+  }
 }
 
 /**
@@ -236,8 +236,7 @@ int SIMIX_context_is_parallel(void) {
 }
 
 /**
- * \brief Returns the number of parallel threads used
- * for the user contexts.
+ * @brief Returns the number of parallel threads used for the user contexts.
  * \return the number of threads (1 means no parallelism)
  */
 int SIMIX_context_get_nthreads(void) {