X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e276e9953a9ab5894bbb623fc17ec79512efab5d..ccd47bd5695175720f504772d3b2dfd517075639:/src/simix/smx_context_ruby.c diff --git a/src/simix/smx_context_ruby.c b/src/simix/smx_context_ruby.c index ad7f1e0f38..07739f5939 100644 --- a/src/simix/smx_context_ruby.c +++ b/src/simix/smx_context_ruby.c @@ -11,7 +11,6 @@ #include "xbt/log.h" #include "xbt/asserts.h" -#include "smx_context_private.h" #include "bindings/ruby_bindings.h" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(ruby); @@ -19,12 +18,12 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(ruby); static smx_context_t smx_ctx_ruby_create_context(xbt_main_func_t code, int argc, char **argv, void_pfn_smxprocess_t cleanup_func, - smx_process_t process); + void *data); static void smx_ctx_ruby_stop(smx_context_t context); static void smx_ctx_ruby_suspend(smx_context_t context); static void smx_ctx_ruby_resume(smx_context_t new_context); -static void smx_ctx_ruby_runall(xbt_swag_t processes); +static void smx_ctx_ruby_runall(xbt_dynar_t processes); void SIMIX_ctx_ruby_factory_init(smx_context_factory_t * factory) { @@ -43,27 +42,28 @@ void SIMIX_ctx_ruby_factory_init(smx_context_factory_t * factory) static smx_context_t smx_ctx_ruby_create_context(xbt_main_func_t code, int argc, char **argv, - void_pfn_smxprocess_t cleanup_func, smx_process_t process) + void_pfn_smxprocess_t cleanup_func, void *data) { smx_ctx_ruby_t context = (smx_ctx_ruby_t) smx_ctx_base_factory_create_context_sized(sizeof(s_smx_ctx_ruby_t), code, argc, argv, - cleanup_func, process); + cleanup_func, data); /* if the user provided a function for the process , then use it Otherwise it's the context for maestro */ if (code) { context->process = (VALUE) code; - DEBUG1("smx_ctx_ruby_create_context(%s)...Done", argv[0]); + XBT_DEBUG("smx_ctx_ruby_create_context(%s)...Done", argv[0]); } + return (smx_context_t) context; } static void smx_ctx_ruby_stop(smx_context_t context) { - DEBUG0("smx_ctx_ruby_stop()"); + XBT_DEBUG("smx_ctx_ruby_stop()"); VALUE process = Qnil; smx_ctx_ruby_t ctx_ruby, current; @@ -71,13 +71,13 @@ static void smx_ctx_ruby_stop(smx_context_t context) ctx_ruby = (smx_ctx_ruby_t) context; - if (simix_global->current_process->iwannadie) { + if (smx_current_context->iwannadie) { if (ctx_ruby->process) { //if the Ruby Process still Alive ,let's Schedule it if (rb_process_isAlive(ctx_ruby->process)) { - current = (smx_ctx_ruby_t) simix_global->current_process->context; + current = (smx_ctx_ruby_t) smx_current_context; rb_process_schedule(current->process); process = ctx_ruby->process; // interupt/kill The Ruby Process @@ -95,7 +95,7 @@ static void smx_ctx_ruby_stop(smx_context_t context) static void smx_ctx_ruby_suspend(smx_context_t context) { - DEBUG1("smx_ctx_ruby_suspend(%s)", context->argv[0]); + XBT_DEBUG("smx_ctx_ruby_suspend(%s)", context->argv[0]); smx_ctx_ruby_t ctx_ruby = (smx_ctx_ruby_t) context; if (ctx_ruby->process) rb_process_unschedule(ctx_ruby->process); @@ -103,19 +103,24 @@ static void smx_ctx_ruby_suspend(smx_context_t context) static void smx_ctx_ruby_resume(smx_context_t new_context) { - DEBUG1("smx_ctx_ruby_resume(%s)", + XBT_DEBUG("smx_ctx_ruby_resume(%s)", (new_context->argc ? new_context->argv[0] : "maestro")); smx_ctx_ruby_t ctx_ruby = (smx_ctx_ruby_t) new_context; rb_process_schedule(ctx_ruby->process); } -static void smx_ctx_ruby_runall(xbt_swag_t processes) +static void smx_ctx_ruby_runall(xbt_dynar_t processes) { smx_process_t process; - while ((process = xbt_swag_extract(processes))) { - simix_global->current_process = process; - smx_ctx_ruby_resume(process->context); - simix_global->current_process = simix_global->maestro_process; - } + smx_context_t old_context; + unsigned int cursor; + + xbt_dynar_foreach(processes, cursor, process) { + old_context = smx_current_context; + smx_current_context = process->context; + smx_ctx_ruby_resume(smx_current_context); + smx_current_context = old_context; + } + xbt_dynar_reset(processes); }