Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
In sequential mode, don't use thread-specific data
[simgrid.git] / src / simix / smx_context.c
index ba9bb88..4926372 100644 (file)
@@ -22,14 +22,13 @@ smx_ctx_factory_initializer_t smx_factory_initializer_to_use = NULL;
 int smx_context_stack_size = 128 * 1024;
 
 #ifdef HAVE_THREAD_LOCAL_STORAGE
-__thread smx_context_t smx_current_context;
+static __thread smx_context_t smx_current_context_parallel;
 #else
-smx_context_t smx_current_context; /* define it anyway, will be used in non-parallel mode */
 static xbt_os_thread_key_t smx_current_context_key = 0;
 #endif
-
+static smx_context_t smx_current_context_serial;
 static int smx_parallel_contexts = 1;
-static int smx_parallel_threshold = 1;
+static int smx_parallel_threshold = 2;
 
 /** 
  * This function is called by SIMIX_global_init() to initialize the context module.
@@ -39,19 +38,21 @@ void SIMIX_context_mod_init(void)
   if (!simix_global->context_factory) {
     /* select the context factory to use to create the contexts */
     if (smx_factory_initializer_to_use) {
-      (*smx_factory_initializer_to_use)(&(simix_global->context_factory));
+      smx_factory_initializer_to_use(&simix_global->context_factory);
     }
     else { /* use the factory specified by --cfg=contexts/factory:value */
 
-      if (smx_context_factory_name == NULL) {
+    if (smx_context_factory_name == NULL) {
         /* use the default factory */
-#ifdef CONTEXT_UCONTEXT
-        SIMIX_ctx_sysv_factory_init(&simix_global->context_factory);
-#else
-        SIMIX_ctx_thread_factory_init(&simix_global->context_factory);
-#endif
-      }
-      else if (!strcmp(smx_context_factory_name, "ucontext")) {
+       #ifdef HAVE_RAWCTX
+       SIMIX_ctx_raw_factory_init(&simix_global->context_factory);
+       #elif CONTEXT_UCONTEXT
+               SIMIX_ctx_sysv_factory_init(&simix_global->context_factory);
+       #else
+               SIMIX_ctx_thread_factory_init(&simix_global->context_factory);
+       #endif
+    }
+    else if (!strcmp(smx_context_factory_name, "ucontext")) {
         /* use ucontext */
 #ifdef CONTEXT_UCONTEXT
         SIMIX_ctx_sysv_factory_init(&simix_global->context_factory);
@@ -68,7 +69,19 @@ void SIMIX_context_mod_init(void)
        SIMIX_ctx_raw_factory_init(&simix_global->context_factory);
       }
       else {
-        xbt_die("Invalid context factory specified");
+        XBT_ERROR("Invalid context factory specified. Valid factories on this machine:");
+#ifdef HAVE_RAWCTX
+        XBT_ERROR("  raw: high performance context factory implemented specifically for SimGrid");
+#else
+        XBT_ERROR("  (raw contextes are disabled at compilation time on this machine -- check configure logs for details)");
+#endif
+#ifdef CONTEXT_UCONTEXT
+        XBT_ERROR("  ucontext: classical system V contextes (implemented with makecontext, swapcontext and friends)");
+#else
+        XBT_ERROR("  (ucontext is disabled at compilation time on this machine -- check configure logs for details)");
+#endif
+        XBT_ERROR("  thread: slow portability layer using system threads (pthreads on UNIX, CreateThread() on windows)");
+        xbt_die("Please use a valid factory.");
       }
     }
   }
@@ -90,7 +103,7 @@ void SIMIX_context_mod_exit(void)
 
     /* finalize the context factory */
     finalize_factory = simix_global->context_factory->finalize;
-    (*finalize_factory) (&simix_global->context_factory);
+    finalize_factory(&simix_global->context_factory);
   }
   xbt_dict_remove((xbt_dict_t) _surf_cfg_set,"contexts/factory");
 }
@@ -168,11 +181,16 @@ XBT_INLINE int SIMIX_context_get_parallel_threshold(void) {
  */
 XBT_INLINE smx_context_t SIMIX_context_get_current(void)
 {
+  if (SIMIX_context_is_parallel()) {
 #ifdef HAVE_THREAD_LOCAL_STORAGE
-  return smx_current_context;
+    return smx_current_context_parallel;
 #else
-  return xbt_os_thread_get_specific(smx_current_context_key);
+    return xbt_os_thread_get_specific(smx_current_context_key);
 #endif
+  }
+  else {
+    return smx_current_context_serial;
+  }
 }
 
 /**
@@ -181,10 +199,15 @@ XBT_INLINE smx_context_t SIMIX_context_get_current(void)
  */
 XBT_INLINE void SIMIX_context_set_current(smx_context_t context)
 {
+  if (SIMIX_context_is_parallel()) {
 #ifdef HAVE_THREAD_LOCAL_STORAGE
-  smx_current_context = context;
+    smx_current_context_parallel = context;
 #else
-  xbt_os_thread_set_specific(smx_current_context_key, context);
+    xbt_os_thread_set_specific(smx_current_context_key, context);
 #endif
+  }
+  else {
+    smx_current_context_serial = context;
+  }
 }