X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a78b29bf9787d3544aadaa7970e349cd9810a81b..da2ce25eaa2fbae84dd3308348b88dab9269211e:/src/simix/smx_context_raw.c diff --git a/src/simix/smx_context_raw.c b/src/simix/smx_context_raw.c index 8b797c5044..66a92649e7 100644 --- a/src/simix/smx_context_raw.c +++ b/src/simix/smx_context_raw.c @@ -38,10 +38,16 @@ extern void raw_swapcontext(raw_stack_t* old, raw_stack_t new); #ifdef PROCESSOR_i686 __asm__ ( +#if defined(APPLE) || defined(_WIN32) + ".text\n" + ".globl _raw_makecontext\n" + "_raw_makecontext:\n" +#else ".text\n" ".globl raw_makecontext\n" ".type raw_makecontext,@function\n" "raw_makecontext:\n" +#endif " movl 4(%esp),%eax\n" /* stack */ " addl 8(%esp),%eax\n" /* size */ " movl 12(%esp),%ecx\n" /* func */ @@ -58,10 +64,16 @@ __asm__ ( ); __asm__ ( +#if defined(APPLE) || defined(_WIN32) + ".text\n" + ".globl _raw_swapcontext\n" + "_raw_swapcontext:\n" +#else ".text\n" ".globl raw_swapcontext\n" ".type raw_swapcontext,@function\n" "raw_swapcontext:\n" +#endif " movl 4(%esp),%eax\n" /* old */ " movl 8(%esp),%edx\n" /* new */ " pushl %ebp\n" @@ -78,10 +90,16 @@ __asm__ ( ); #elif PROCESSOR_x86_64 __asm__ ( +#if defined(APPLE) || defined(_WIN32) + ".text\n" + ".globl _raw_makecontext\n" + "_raw_makecontext:\n" +#else ".text\n" ".globl raw_makecontext\n" ".type raw_makecontext,@function\n" - "raw_makecontext:\n" /* Calling convention sets the arguments in rdi, rsi, rdx and rcx, respectively */ + "raw_makecontext:\n"/* Calling convention sets the arguments in rdi, rsi, rdx and rcx, respectively */ +#endif " movq %rdi,%rax\n" /* stack */ " addq %rsi,%rax\n" /* size */ " movq $0, -8(%rax)\n" /* @return for func */ @@ -103,10 +121,16 @@ __asm__ ( ); __asm__ ( +#if defined(APPLE) || defined(_WIN32) + ".text\n" + ".globl _raw_swapcontext\n" + "_raw_swapcontext:\n" +#else ".text\n" ".globl raw_swapcontext\n" ".type raw_swapcontext,@function\n" - "raw_swapcontext:\n" /* Calling convention sets the arguments in rdi and rsi, respectively */ + "raw_swapcontext:\n" /* Calling convention sets the arguments in rdi and rsi, respectively */ +#endif " pushq %rdi\n" " pushq %rsi\n" " pushq %rdx\n" @@ -157,8 +181,6 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context); static xbt_parmap_t parmap; #endif -static smx_context_factory_t raw_factory; - #ifdef TIME_BENCH #include "xbt/xbt_os_time.h" #define NUM_THREADS 4 @@ -242,7 +264,7 @@ static void smx_ctx_raw_free(smx_context_t context) static void smx_ctx_raw_suspend(smx_context_t context) { - smx_current_context = (smx_context_t)maestro_raw_context; + SIMIX_context_set_current((smx_context_t) maestro_raw_context); raw_swapcontext( &((smx_ctx_raw_t) context)->stack_top, ((smx_ctx_raw_t) context)->old_stack_top); @@ -264,7 +286,7 @@ static void smx_ctx_raw_wrapper(smx_ctx_raw_t context) static void smx_ctx_raw_resume(smx_process_t process) { smx_ctx_raw_t context = (smx_ctx_raw_t)process->context; - smx_current_context = (smx_context_t)context; + SIMIX_context_set_current((smx_context_t) context); raw_swapcontext( &((smx_ctx_raw_t) context)->old_stack_top, ((smx_ctx_raw_t) context)->stack_top); @@ -316,8 +338,6 @@ static void smx_ctx_raw_runall_serial(xbt_dynar_t processes) XBT_VERB("Time SSR thread %u = %lf (max %lf)", cursor, time_thread_ssr[cursor], tmax); time_wasted_ssr += tmax - time_thread_ssr[cursor]; } - - xbt_dynar_reset(processes); } void smx_ctx_raw_new_sr(void); @@ -340,48 +360,35 @@ void smx_ctx_raw_new_sr(void) XBT_VERB("New scheduling round"); } #else -static void smx_ctx_raw_runall_serial(xbt_dynar_t processes) +static void smx_ctx_raw_runall_serial() { smx_process_t process; unsigned int cursor; - xbt_dynar_foreach(processes, cursor, process) { - XBT_DEBUG("Schedule item %u of %lu",cursor,xbt_dynar_length(processes)); + xbt_dynar_foreach(simix_global->process_to_run, cursor, process) { + XBT_DEBUG("Schedule item %u of %lu", cursor, xbt_dynar_length(simix_global->process_to_run)); smx_ctx_raw_resume(process); } - xbt_dynar_reset(processes); } #endif -static void smx_ctx_raw_runall_parallel(xbt_dynar_t processes) +static void smx_ctx_raw_runall_parallel() { #ifdef CONTEXT_THREADS - xbt_parmap_apply(parmap, (void_f_pvoid_t)smx_ctx_raw_resume, processes); + xbt_parmap_apply(parmap, (void_f_pvoid_t) smx_ctx_raw_resume, + simix_global->process_to_run); #endif - xbt_dynar_reset(processes); -} - -static smx_context_t smx_ctx_raw_self_parallel(void) -{ - return smx_current_context; -} - -static int smx_ctx_raw_get_thread_id(){ - return (int)(unsigned long)xbt_os_thread_get_extra_data(); } -static void smx_ctx_raw_runall(xbt_dynar_t processes) +static void smx_ctx_raw_runall() { - if (xbt_dynar_length(processes) >= SIMIX_context_get_parallel_threshold()) { - XBT_DEBUG("Runall // %lu", xbt_dynar_length(processes)); - raw_factory->self = smx_ctx_raw_self_parallel; - raw_factory->get_thread_id = smx_ctx_raw_get_thread_id; - smx_ctx_raw_runall_parallel(processes); + unsigned long nb_processes = xbt_dynar_length(simix_global->process_to_run); + if (nb_processes >= SIMIX_context_get_parallel_threshold()) { + XBT_DEBUG("Runall // %lu", nb_processes); + smx_ctx_raw_runall_parallel(); } else { - XBT_DEBUG("Runall serial %lu", xbt_dynar_length(processes)); - raw_factory->self = smx_ctx_base_self; - raw_factory->get_thread_id = smx_ctx_base_get_thread_id; - smx_ctx_raw_runall_serial(processes); + XBT_DEBUG("Runall serial %lu", nb_processes); + smx_ctx_raw_runall_serial(); } } @@ -408,18 +415,13 @@ void SIMIX_ctx_raw_factory_init(smx_context_factory_t *factory) } else { /* always parallel */ - (*factory)->self = smx_ctx_raw_self_parallel; - (*factory)->get_thread_id = smx_ctx_raw_get_thread_id; (*factory)->runall = smx_ctx_raw_runall_parallel; } } else { /* always serial */ - (*factory)->self = smx_ctx_base_self; - (*factory)->get_thread_id = smx_ctx_base_get_thread_id; (*factory)->runall = smx_ctx_raw_runall_serial; } - raw_factory = *factory; #ifdef TIME_BENCH timer = xbt_os_timer_new(); #endif