#include "portable.h"
#include "xbt/log.h"
#include "xbt/swag.h"
-#include "private.h"
+#include "xbt/xbt_os_thread.h"
+#include "src/simix/private.h"
#include "simix/context.h"
#include "gras_config.h"
smx_ctx_factory_initializer_t smx_factory_initializer_to_use = NULL;
int smx_context_stack_size = 128 * 1024;
-#ifdef CONTEXT_THREADS
+#ifdef HAVE_THREAD_LOCAL_STORAGE
__thread smx_context_t smx_current_context;
#else
-smx_context_t smx_current_context;
+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 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.
#ifdef CONTEXT_UCONTEXT
SIMIX_ctx_sysv_factory_init(&simix_global->context_factory);
#else
- xbt_die("The ontext factory 'ucontext' unavailable on your system");
+ xbt_die("The context factory 'ucontext' unavailable on your system");
#endif
}
else if (!strcmp(smx_context_factory_name, "thread")) {
}
}
}
+
+#if defined(CONTEXT_THREADS) && !defined(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
}
/**
return smx_parallel_threshold;
}
+/**
+ * \brief Returns the current context of this thread.
+ * \return the current context of this thread
+ */
+XBT_INLINE smx_context_t SIMIX_context_get_current(void)
+{
+#ifdef HAVE_THREAD_LOCAL_STORAGE
+ return smx_current_context;
+#else
+ return xbt_os_thread_get_specific(smx_current_context_key);
+#endif
+}
+
+/**
+ * \brief Sets the current context of this thread.
+ * \param context the context to set
+ */
+XBT_INLINE void SIMIX_context_set_current(smx_context_t context)
+{
+#ifdef HAVE_THREAD_LOCAL_STORAGE
+ smx_current_context = context;
+#else
+ xbt_os_thread_set_specific(smx_current_context_key, context);
+#endif
+}
+