X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ea55b530facfb04b499b016152f739e024445aa4..4bc88c13ed1b358c2cd32e09b85e52e5fdb21b05:/src/simix/smx_context.cpp diff --git a/src/simix/smx_context.cpp b/src/simix/smx_context.cpp index ace2095439..82a78fd036 100644 --- a/src/simix/smx_context.cpp +++ b/src/simix/smx_context.cpp @@ -11,6 +11,7 @@ #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" @@ -28,15 +29,13 @@ #define _aligned_free __mingw_aligned_free #endif //MINGW -#ifdef HAVE_VALGRIND_VALGRIND_H +#ifdef HAVE_VALGRIND_H # 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 */ -smx_ctx_factory_initializer_t smx_factory_initializer_to_use = NULL; int smx_context_stack_size; int smx_context_stack_size_was_set = 0; int smx_context_guard_size; @@ -56,59 +55,52 @@ 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); #endif 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); - } + if (simgrid::simix::factory_initializer) + simix_global->context_factory = simgrid::simix::factory_initializer(); else { /* use the factory specified by --cfg=contexts/factory:value */ - - - if (!strcmp(smx_context_factory_name, "thread")) { - /* use os threads (either pthreads or windows ones) */ - SIMIX_ctx_thread_factory_init(&simix_global->context_factory); - } -#ifdef CONTEXT_UCONTEXT - else if (!strcmp(smx_context_factory_name, "ucontext")) { - /* use ucontext */ - SIMIX_ctx_sysv_factory_init(&simix_global->context_factory); - } +#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 HAVE_RAWCTX - else if (!strcmp(smx_context_factory_name, "raw")) { - /* use raw contexts */ - SIMIX_ctx_raw_factory_init(&simix_global->context_factory); - } +#ifdef HAVE_UCONTEXT_CONTEXTS + else if (!strcmp(smx_context_factory_name, "ucontext")) + simix_global->context_factory = simgrid::simix::sysv_factory(); #endif -#ifdef HAVE_BOOST_CONTEXT - else if (!strcmp(smx_context_factory_name, "boost")) { - /* use Boost.Context */ - SIMIX_ctx_boost_factory_init(&simix_global->context_factory); - } +#ifdef HAVE_RAW_CONTEXTS + else if (!strcmp(smx_context_factory_name, "raw")) + simix_global->context_factory = simgrid::simix::raw_factory(); +#endif +#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."); } } @@ -120,14 +112,8 @@ void SIMIX_context_mod_init(void) */ void SIMIX_context_mod_exit(void) { - if (simix_global->context_factory) { - smx_pfn_context_factory_finalize_t finalize_factory; - - /* finalize the context factory */ - finalize_factory = simix_global->context_factory->finalize; - finalize_factory(&simix_global->context_factory); - } - xbt_dict_remove((xbt_dict_t) _sg_cfg_set,"contexts/factory"); + delete simix_global->context_factory; + simix_global->context_factory = nullptr; } void *SIMIX_context_stack_new(void) @@ -140,30 +126,29 @@ 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 size_t size = smx_context_stack_size + smx_context_guard_size; -#ifdef HAVE_MC +#if 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 @@ -175,11 +160,9 @@ void *SIMIX_context_stack_new(void) stack = xbt_malloc0(smx_context_stack_size); } -#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); +#ifdef HAVE_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); #endif return stack; @@ -190,36 +173,30 @@ void SIMIX_context_stack_delete(void *stack) if (!stack) return; -#ifdef HAVE_VALGRIND_VALGRIND_H +#ifdef HAVE_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 */ } -#ifdef HAVE_MC +#if HAVE_MC /* Retrieve the saved pointer. See SIMIX_context_stack_new above. */ 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; } @@ -248,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; }