X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/467944fe0ac76fb00b1e9b3a919b1ce4a165ef0f..548029a96b99a66a16b530071b492e7d3dcd9e5e:/src/simix/smx_context_sysv.c diff --git a/src/simix/smx_context_sysv.c b/src/simix/smx_context_sysv.c index 775db1c1be..a1dc635770 100644 --- a/src/simix/smx_context_sysv.c +++ b/src/simix/smx_context_sysv.c @@ -12,23 +12,27 @@ #ifdef HAVE_VALGRIND_VALGRIND_H # include -#endif /* HAVE_VALGRIND_VALGRIND_H */ +#endif /* HAVE_VALGRIND_VALGRIND_H */ -#ifdef WIN32 - #include "ucontext.h" - #include "ucontext.c" +#ifdef _XBT_WIN32 +#include "win32_ucontext.h" +#include "win32_ucontext.c" +#else +#include "ucontext.h" #endif XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context); -static smx_context_t -smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char** argv, - void_f_pvoid_t cleanup_func, void* cleanup_arg); +static smx_context_t +smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv, + void_f_pvoid_t cleanup_func, + void *cleanup_arg); static void smx_ctx_sysv_wrapper(void); -void SIMIX_ctx_sysv_factory_init(smx_context_factory_t *factory) { +void SIMIX_ctx_sysv_factory_init(smx_context_factory_t * factory) +{ smx_ctx_base_factory_init(factory); @@ -42,18 +46,27 @@ void SIMIX_ctx_sysv_factory_init(smx_context_factory_t *factory) { } smx_context_t -smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code, int argc, char** argv, - void_f_pvoid_t cleanup_func, void* cleanup_arg) { - - smx_ctx_sysv_t context = (smx_ctx_sysv_t)smx_ctx_base_factory_create_context_sized - (size, code,argc,argv,cleanup_func,cleanup_arg); +smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code, + int argc, char **argv, + void_f_pvoid_t cleanup_func, + void *cleanup_arg) +{ + + smx_ctx_sysv_t context = + (smx_ctx_sysv_t) smx_ctx_base_factory_create_context_sized(size, + code, + argc, + argv, + cleanup_func, + cleanup_arg); /* If the user provided a function for the process then use it otherwise is the context for maestro */ - if(code){ + if (code) { xbt_assert2(getcontext(&(context->uc)) == 0, - "Error in context saving: %d (%s)", errno, strerror(errno)); + "Error in context saving: %d (%s)", errno, + strerror(errno)); context->uc.uc_link = NULL; @@ -66,72 +79,83 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code, int argc, c #ifdef HAVE_VALGRIND_VALGRIND_H context->valgrind_stack_id = VALGRIND_STACK_REGISTER(context->uc.uc_stack.ss_sp, - ((char *) context->uc.uc_stack.ss_sp) + - context->uc.uc_stack.ss_size); -#endif /* HAVE_VALGRIND_VALGRIND_H */ + ((char *) context->uc.uc_stack.ss_sp) + + context->uc.uc_stack.ss_size); +#endif /* HAVE_VALGRIND_VALGRIND_H */ - makecontext(&((smx_ctx_sysv_t)context)->uc, smx_ctx_sysv_wrapper, 0); + makecontext(&((smx_ctx_sysv_t) context)->uc, smx_ctx_sysv_wrapper, 0); } - return (smx_context_t)context; + return (smx_context_t) context; } static smx_context_t -smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char** argv, - void_f_pvoid_t cleanup_func, void* cleanup_arg) { +smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv, + void_f_pvoid_t cleanup_func, void *cleanup_arg) +{ return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t), - code,argc,argv,cleanup_func,cleanup_arg); + code, argc, argv, cleanup_func, + cleanup_arg); } -void smx_ctx_sysv_free(smx_context_t context) { +void smx_ctx_sysv_free(smx_context_t context) +{ - if (context){ + if (context) { #ifdef HAVE_VALGRIND_VALGRIND_H - VALGRIND_STACK_DEREGISTER(((smx_ctx_sysv_t) context)->valgrind_stack_id); -#endif /* HAVE_VALGRIND_VALGRIND_H */ + VALGRIND_STACK_DEREGISTER(((smx_ctx_sysv_t) + context)->valgrind_stack_id); +#endif /* HAVE_VALGRIND_VALGRIND_H */ } smx_ctx_base_free(context); } -void smx_ctx_sysv_stop(smx_context_t context) { +void smx_ctx_sysv_stop(smx_context_t context) +{ smx_ctx_base_stop(context); smx_ctx_sysv_suspend(context); } -void smx_ctx_sysv_wrapper() { +void smx_ctx_sysv_wrapper() +{ /*FIXME: I would like to avoid accessing simix_global to get the current - context by passing it as an argument of the wrapper function. The problem - is that this function is called from smx_ctx_sysv_start, and uses - makecontext for calling it, and the stupid posix specification states that - all the arguments of the function should be int(32 bits), making it useless - in 64-bit architectures where pointers are 64 bit long. + context by passing it as an argument of the wrapper function. The problem + is that this function is called from smx_ctx_sysv_start, and uses + makecontext for calling it, and the stupid posix specification states that + all the arguments of the function should be int(32 bits), making it useless + in 64-bit architectures where pointers are 64 bit long. */ - smx_ctx_sysv_t context = - (smx_ctx_sysv_t)simix_global->current_process->context; + smx_ctx_sysv_t context = + (smx_ctx_sysv_t) simix_global->current_process->context; (context->super.code) (context->super.argc, context->super.argv); - smx_ctx_sysv_stop((smx_context_t)context); + smx_ctx_sysv_stop((smx_context_t) context); } -void smx_ctx_sysv_suspend(smx_context_t context) { - ucontext_t maestro_ctx = ((smx_ctx_sysv_t)simix_global->maestro_process->context)->uc; +void smx_ctx_sysv_suspend(smx_context_t context) +{ + ucontext_t maestro_ctx = + ((smx_ctx_sysv_t) simix_global->maestro_process->context)->uc; int rv = swapcontext(&((smx_ctx_sysv_t) context)->uc, &maestro_ctx); xbt_assert0((rv == 0), "Context swapping failure"); } -void smx_ctx_sysv_resume(smx_context_t new_context) { - smx_ctx_sysv_t maestro = (smx_ctx_sysv_t)simix_global->maestro_process->context; +void smx_ctx_sysv_resume(smx_context_t new_context) +{ + smx_ctx_sysv_t maestro = + (smx_ctx_sysv_t) simix_global->maestro_process->context; - int rv = swapcontext(&(maestro->uc), &((smx_ctx_sysv_t)new_context)->uc); + int rv = + swapcontext(&(maestro->uc), &((smx_ctx_sysv_t) new_context)->uc); xbt_assert0((rv == 0), "Context swapping failure"); }