X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ee6ffc12bf5523e4d2d2193138c791d991ec0ae4..404c50aac04e8ea4708cad0b80290945d4d07838:/src/simix/smx_context.cpp diff --git a/src/simix/smx_context.cpp b/src/simix/smx_context.cpp index bacb466183..9e2dab9ffb 100644 --- a/src/simix/smx_context.cpp +++ b/src/simix/smx_context.cpp @@ -33,8 +33,7 @@ # include #endif -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_context, simix, - "Context switching mechanism"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_context, simix, "Context switching mechanism"); char* smx_context_factory_name = NULL; /* factory name specified by --cfg=contexts/factory:value */ int smx_context_stack_size; @@ -56,7 +55,7 @@ static e_xbt_parmap_mode_t smx_parallel_synchronization_mode = XBT_PARMAP_DEFAUL */ void SIMIX_context_mod_init(void) { -#if defined(CONTEXT_THREADS) && !defined(HAVE_THREAD_LOCAL_STORAGE) +#if defined(HAVE_THREAD_CONTEXTS) && !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); @@ -66,42 +65,42 @@ void SIMIX_context_mod_init(void) if (simgrid::simix::factory_initializer) simix_global->context_factory = simgrid::simix::factory_initializer(); else { /* use the factory specified by --cfg=contexts/factory:value */ -#if defined(CONTEXT_THREADS) +#if defined(HAVE_THREAD_CONTEXTS) if (!strcmp(smx_context_factory_name, "thread")) simix_global->context_factory = simgrid::simix::thread_factory(); #else if (0); #endif -#ifdef CONTEXT_UCONTEXT +#ifdef HAVE_UCONTEXT_CONTEXTS else if (!strcmp(smx_context_factory_name, "ucontext")) simix_global->context_factory = simgrid::simix::sysv_factory(); #endif -#ifdef HAVE_RAWCTX +#ifdef HAVE_RAW_CONTEXTS else if (!strcmp(smx_context_factory_name, "raw")) simix_global->context_factory = simgrid::simix::raw_factory(); #endif -#ifdef HAVE_BOOST_CONTEXT +#ifdef HAVE_BOOST_CONTEXTS else if (!strcmp(smx_context_factory_name, "boost")) simix_global->context_factory = simgrid::simix::boost_factory(); #endif else { XBT_ERROR("Invalid context factory specified. Valid factories on this machine:"); -#ifdef HAVE_RAWCTX +#ifdef 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 -#ifdef CONTEXT_UCONTEXT +#ifdef 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 -#ifdef HAVE_BOOST_CONTEXT +#ifdef 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 system threads (pthreads on UNIX, CreateThread() on windows)"); + XBT_ERROR(" thread: slow portability layer using pthreads as provided by gcc"); xbt_die("Please use a valid factory."); } } @@ -115,7 +114,6 @@ void SIMIX_context_mod_exit(void) { delete simix_global->context_factory; simix_global->context_factory = nullptr; - xbt_dict_remove((xbt_dict_t) _sg_cfg_set,"contexts/factory"); } void *SIMIX_context_stack_new(void) @@ -128,11 +126,10 @@ void *SIMIX_context_stack_new(void) if (smx_context_guard_size > 0 && !MC_is_active()) { -#if defined(_XBT_WIN32) || (PTH_STACKGROWTH != -1) +#if !defined(PTH_STACKGROWTH) || (PTH_STACKGROWTH != -1) static int warned_once = 0; if (!warned_once) { - XBT_WARN("Stack overflow protection is known to be broken on your system. Either you're on Windows or PTH_STACKGROWTH != -1 (current value is %d).", - PTH_STACKGROWTH); + 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 @@ -141,17 +138,17 @@ void *SIMIX_context_stack_new(void) #ifdef HAVE_MC /* Cannot use posix_memalign when HAVE_MC. Align stack by hand, and save the * pointer returned by xbt_malloc0. */ - char *alloc = xbt_malloc0(size + xbt_pagesize); + char *alloc = (char*)xbt_malloc0(size + xbt_pagesize); stack = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize; *((void **)stack - 1) = alloc; -#elif !defined(_XBT_WIN32) +#elif !defined(_WIN32) if (posix_memalign(&stack, xbt_pagesize, size) != 0) xbt_die("Failed to allocate stack."); #else stack = _aligned_malloc(size, xbt_pagesize); #endif -#ifndef _XBT_WIN32 +#ifndef _WIN32 if (mprotect(stack, smx_context_guard_size, PROT_NONE) == -1) { xbt_die("Failed to protect stack: %s", strerror(errno)); /* This is fatal. We are going to fail at some point when @@ -164,10 +161,8 @@ void *SIMIX_context_stack_new(void) } #ifdef HAVE_VALGRIND_VALGRIND_H - unsigned int valgrind_stack_id = - VALGRIND_STACK_REGISTER(stack, (char *)stack + smx_context_stack_size); - memcpy((char *)stack + smx_context_usable_stack_size, &valgrind_stack_id, - sizeof valgrind_stack_id); + unsigned int valgrind_stack_id = VALGRIND_STACK_REGISTER(stack, (char *)stack + smx_context_stack_size); + memcpy((char *)stack + smx_context_usable_stack_size, &valgrind_stack_id, sizeof valgrind_stack_id); #endif return stack; @@ -180,16 +175,14 @@ void SIMIX_context_stack_delete(void *stack) #ifdef HAVE_VALGRIND_VALGRIND_H unsigned int valgrind_stack_id; - memcpy(&valgrind_stack_id, (char *)stack + smx_context_usable_stack_size, - sizeof valgrind_stack_id); + memcpy(&valgrind_stack_id, (char *)stack + smx_context_usable_stack_size, sizeof valgrind_stack_id); VALGRIND_STACK_DEREGISTER(valgrind_stack_id); #endif -#ifndef WIN32 +#ifndef _WIN32 if (smx_context_guard_size > 0 && !MC_is_active()) { stack = (char *)stack - smx_context_guard_size; - if (mprotect(stack, smx_context_guard_size, - PROT_READ | PROT_WRITE) == -1) { + 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 */ } @@ -198,16 +191,12 @@ void SIMIX_context_stack_delete(void *stack) stack = *((void **)stack - 1); #endif } -#endif +#endif /* not windows */ xbt_free(stack); } -/** - * \brief Returns whether some parallel threads are used - * for the user contexts. - * \return 1 if parallelism is used - */ +/** @brief Returns whether some parallel threads are used for the user contexts. */ int SIMIX_context_is_parallel(void) { return smx_parallel_contexts > 1; } @@ -236,12 +225,9 @@ void SIMIX_context_set_nthreads(int nb_threads) { nb_threads = xbt_os_get_numcores(); XBT_INFO("Auto-setting contexts/nthreads to %d",nb_threads); } - - if (nb_threads > 1) { -#ifndef CONTEXT_THREADS - THROWF(arg_error, 0, "The thread factory cannot be run in parallel"); +#ifndef HAVE_THREAD_CONTEXTS + xbt_assert(nb_threads == 1, "Parallel runs are impossible when the pthreads are missing."); #endif - } smx_parallel_contexts = nb_threads; }