X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e97586e69c51b7a4b08337e7d819efcd44ad9766..6ee7e9c2e455536ab817ae0136acfbb53822eecd:/src/simix/smx_context_thread.c diff --git a/src/simix/smx_context_thread.c b/src/simix/smx_context_thread.c index f7364751e8..cc9de82775 100644 --- a/src/simix/smx_context_thread.c +++ b/src/simix/smx_context_thread.c @@ -33,8 +33,8 @@ static void smx_ctx_thread_free(smx_context_t context); static void smx_ctx_thread_stop(smx_context_t context); static void smx_ctx_thread_suspend(smx_context_t context); static void smx_ctx_thread_resume(smx_context_t new_context); -static void smx_ctx_thread_runall_serial(xbt_swag_t processes); -static void smx_ctx_thread_runall_parallel(xbt_swag_t processes); +static void smx_ctx_thread_runall_serial(xbt_dynar_t processes); +static void smx_ctx_thread_runall_parallel(xbt_dynar_t processes); static smx_context_t smx_ctx_thread_self(void); static void *smx_ctx_thread_wrapper(void *param); @@ -42,6 +42,7 @@ static void *smx_ctx_thread_wrapper(void *param); void SIMIX_ctx_thread_factory_init(smx_context_factory_t * factory) { smx_ctx_base_factory_init(factory); + XBT_VERB("Activating thread context factory"); (*factory)->create_context = smx_ctx_thread_factory_create_context; /* Do not overload that method (*factory)->finalize */ @@ -49,7 +50,7 @@ void SIMIX_ctx_thread_factory_init(smx_context_factory_t * factory) (*factory)->stop = smx_ctx_thread_stop; (*factory)->suspend = smx_ctx_thread_suspend; - if(_surf_parallel_contexts) + if (SIMIX_context_is_parallel()) (*factory)->runall = smx_ctx_thread_runall_parallel; else (*factory)->runall = smx_ctx_thread_runall_serial; @@ -142,23 +143,30 @@ static void smx_ctx_thread_suspend(smx_context_t context) xbt_os_sem_acquire(((smx_ctx_thread_t) context)->begin); } -static void smx_ctx_thread_runall_serial(xbt_swag_t processes) +static void smx_ctx_thread_runall_serial(xbt_dynar_t processes) { smx_process_t process; - while ((process = xbt_swag_extract(processes))) { + unsigned int cursor; + + xbt_dynar_foreach(processes, cursor, process) { xbt_os_sem_release(((smx_ctx_thread_t) process->context)->begin); xbt_os_sem_acquire(((smx_ctx_thread_t) process->context)->end); } + xbt_dynar_reset(processes); } -static void smx_ctx_thread_runall_parallel(xbt_swag_t processes) +static void smx_ctx_thread_runall_parallel(xbt_dynar_t processes) { - smx_process_t process, p_next; - xbt_swag_foreach_safe(process, p_next, processes) + unsigned int index; + smx_process_t process; + + xbt_dynar_foreach(processes, index, process) xbt_os_sem_release(((smx_ctx_thread_t) process->context)->begin); - while ((process = xbt_swag_extract(processes))) - xbt_os_sem_acquire(((smx_ctx_thread_t) process->context)->end); + xbt_dynar_foreach(processes, index, process) { + xbt_os_sem_acquire(((smx_ctx_thread_t) process->context)->end); + } + xbt_dynar_reset(processes); } static smx_context_t smx_ctx_thread_self(void)