#include <sys/mman.h>
#endif
-#ifdef __MINGW32__
-#define _aligned_malloc __mingw_aligned_malloc
-#define _aligned_free __mingw_aligned_free
-#endif //MINGW
+#ifdef __MINGW32__
+#define _aligned_malloc __mingw_aligned_malloc
+#define _aligned_free __mingw_aligned_free
+#endif /*MINGW*/
#if HAVE_VALGRIND_H
# include <valgrind/valgrind.h>
(std::string("Possible values: ")+contexts_list()).c_str(),
context_factories[0].first);
-int smx_context_stack_size;
+unsigned smx_context_stack_size;
int smx_context_stack_size_was_set = 0;
-int smx_context_guard_size;
+unsigned smx_context_guard_size;
int smx_context_guard_size_was_set = 0;
#if HAVE_THREAD_LOCAL_STORAGE
static XBT_THREAD_LOCAL smx_context_t smx_current_context_parallel;
{
xbt_assert(simix_global->context_factory == nullptr);
-#if HAVE_THREAD_CONTEXTS && !HAVE_THREAD_LOCAL_STORAGE
+#if HAVE_THREAD_CONTEXTS && not 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 defined(__APPLE__) || defined(__NetBSD__)
+ if (context_factory_name == std::string("thread") &&
+ strcmp(xbt_cfg_get_string("smpi/privatization"), "dlopen") == 0) {
+ XBT_WARN("dlopen+thread broken on Apple and BSD. Switching to raw contexts.");
+ context_factory_name = "raw";
+ }
+#endif
+#if defined(__FreeBSD__)
+ if (context_factory_name == std::string("thread") && strcmp(xbt_cfg_get_string("smpi/privatization"), "no") != 0) {
+ XBT_WARN("mmap broken on FreeBSD, but dlopen+thread broken too. Switching to dlopen+raw contexts.");
+ context_factory_name = "raw";
+ }
+#endif
+
/* select the context factory to use to create the contexts */
if (simgrid::kernel::context::factory_initializer) { // Give Java a chance to hijack the factory mechanism
simix_global->context_factory = simgrid::kernel::context::factory_initializer();
* growing downward (PTH_STACKGROWTH == -1). Protected pages need to be put
* after the stack when PTH_STACKGROWTH == 1. */
- if (smx_context_guard_size > 0 && !MC_is_active()) {
+ if (smx_context_guard_size > 0 && not MC_is_active()) {
#if !defined(PTH_STACKGROWTH) || (PTH_STACKGROWTH != -1)
static int warned_once = 0;
- if (!warned_once) {
+ if (not warned_once) {
XBT_WARN("Stack overflow protection is known to be broken on your system. Either stack grows upwards, or it was not even tested properly.");
warned_once = 1;
}
#endif
size_t size = smx_context_stack_size + smx_context_guard_size;
-#if HAVE_MC
- /* Cannot use posix_memalign when HAVE_MC. Align stack by hand, and save the
+#if SIMGRID_HAVE_MC
+ /* Cannot use posix_memalign when SIMGRID_HAVE_MC. Align stack by hand, and save the
* pointer returned by xbt_malloc0. */
char *alloc = (char*)xbt_malloc0(size + xbt_pagesize);
stack = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize;
void SIMIX_context_stack_delete(void *stack)
{
- if (!stack)
+ if (not stack)
return;
#if HAVE_VALGRIND_H
#endif
#ifndef _WIN32
- if (smx_context_guard_size > 0 && !MC_is_active()) {
+ if (smx_context_guard_size > 0 && not MC_is_active()) {
stack = (char *)stack - smx_context_guard_size;
if (mprotect(stack, smx_context_guard_size, PROT_READ | PROT_WRITE) == -1) {
XBT_WARN("Failed to remove page protection: %s", strerror(errno));
/* try to pursue anyway */
}
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
/* Retrieve the saved pointer. See SIMIX_context_stack_new above. */
stack = *((void **)stack - 1);
#endif
* \param nb_threads the number of threads to use
*/
void SIMIX_context_set_nthreads(int nb_threads) {
- if (nb_threads<=0) {
+ if (nb_threads<=0) {
nb_threads = xbt_os_get_numcores();
XBT_INFO("Auto-setting contexts/nthreads to %d",nb_threads);
- }
+ }
#if !HAVE_THREAD_CONTEXTS
xbt_assert(nb_threads == 1, "Parallel runs are impossible when the pthreads are missing.");
#endif