From: mquinson Date: Fri, 6 Jul 2007 20:22:40 +0000 (+0000) Subject: Rename some struct fields in private datatype to explicit whether they are smx object... X-Git-Tag: v3.3~1692 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/64d2562eea7ac471385b53b55a338ab3a15fd746?hp=a0432353f714a914f179660603a6ce728070a7ec;ds=sidebyside Rename some struct fields in private datatype to explicit whether they are smx objects or msg ones + some code allowing the upper JAVA layer (user interface) to pass some information to the bottom one (context implementation) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3668 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/simix/private.h b/src/simix/private.h index 48dfde9548..1ef1e42898 100644 --- a/src/simix/private.h +++ b/src/simix/private.h @@ -46,7 +46,7 @@ extern SIMIX_Global_t simix_global; /******************************* Process *************************************/ typedef struct s_smx_simdata_process { - smx_host_t host; /* the host on which the process is running */ + smx_host_t s_host; /* the host on which the process is running */ xbt_context_t context; /* the context that executes the scheduler fonction */ int blocked; int suspended; diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index b84d48d9d1..42225ef0d1 100644 --- a/src/simix/smx_global.c +++ b/src/simix/smx_global.c @@ -62,7 +62,7 @@ void __SIMIX_display_process_status(void) asprintf(&who,"%s on %s: %s", process->name, - p_simdata->host->name, + p_simdata->s_host->name, (process->simdata->blocked)?"[BLOCKED] " :((process->simdata->suspended)?"[SUSPENDED] ":"")); @@ -126,7 +126,7 @@ void __SIMIX_main(void) xbt_fifo_foreach(smx_action->cond_list,_cursor,cond,smx_cond_t) { xbt_swag_foreach(process,cond->sleeping) { DEBUG2("\t preparing to wake up %s on %s", - process->name, process->simdata->host->name); + process->name, process->simdata->s_host->name); } SIMIX_cond_broadcast(cond); /* remove conditional from action */ @@ -141,7 +141,7 @@ void __SIMIX_main(void) xbt_fifo_foreach(smx_action->cond_list,_cursor,cond,smx_cond_t) { xbt_swag_foreach(process,cond->sleeping) { DEBUG2("\t preparing to wake up %s on %s", - process->name, process->simdata->host->name); + process->name, process->simdata->s_host->name); } SIMIX_cond_broadcast(cond); /* remove conditional from action */ @@ -243,7 +243,7 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed) while ((process = xbt_swag_extract(simix_global->process_to_run))) { DEBUG2("Scheduling %s on %s", process->name, - process->simdata->host->name); + process->simdata->s_host->name); simix_global->current_process = process; xbt_context_schedule(process->simdata->context); /* fflush(NULL); */ @@ -289,7 +289,7 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed) if(fun==SIMIX_process_kill) { process = arg; DEBUG2("Killing %s on %s", process->name, - process->simdata->host->name); + process->simdata->s_host->name); SIMIX_process_kill(process); } } diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 292177f5b2..74750b065c 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -26,7 +26,7 @@ void SIMIX_process_cleanup(void *arg) { xbt_swag_remove(arg, simix_global->process_list); xbt_swag_remove(arg, simix_global->process_to_run); - xbt_swag_remove(arg, ((smx_process_t) arg)->simdata->host->simdata->process_list); + xbt_swag_remove(arg, ((smx_process_t) arg)->simdata->s_host->simdata->process_list); free(((smx_process_t) arg)->name); ((smx_process_t) arg)->name = NULL; @@ -50,18 +50,19 @@ void SIMIX_process_cleanup(void *arg) * \return The new corresponding object. */ smx_process_t SIMIX_process_create(const char *name, - smx_process_code_t code, void *data, - const char * hostname, int argc, char **argv, void * clean_process_function) + smx_process_code_t code, void *data, + const char * hostname, int argc, char **argv, + void * clean_process_function) { smx_simdata_process_t simdata = xbt_new0(s_smx_simdata_process_t,1); smx_process_t process = xbt_new0(s_smx_process_t,1); smx_process_t self = NULL; - smx_host_t host = SIMIX_host_get_by_name(hostname); + smx_host_t host = SIMIX_host_get_by_name(hostname); xbt_assert0(((code != NULL) && (host != NULL)), "Invalid parameters"); /* Simulator Data */ - simdata->host = host; + simdata->s_host = host; simdata->mutex = NULL; simdata->cond = NULL; simdata->argc = argc; @@ -97,6 +98,55 @@ smx_process_t SIMIX_process_create(const char *name, return process; } +/** + * \brief Creates and runs a new #smx_process_t hosting a JAVA thread + * + * Warning: this should only be used in libsimgrid4java, since it create + * a context with no code, which leads to segfaults in plain libsimgrid + */ +smx_process_t SIMIX_jprocess_create(const char *name, smx_host_t host, + void *data, + void *jprocess, void *jenv) +{ + smx_simdata_process_t simdata = xbt_new0(s_smx_simdata_process_t,1); + smx_process_t process = xbt_new0(s_smx_process_t,1); + smx_process_t self = NULL; + + DEBUG5("jprocess_create(name=%s,host=%p,data=%p,jproc=%p,jenv=%p)", + name,host,data,jprocess,jenv); + xbt_assert0(host, "Invalid parameters"); + /* Simulator Data */ + simdata->s_host = host; + simdata->mutex = NULL; + simdata->cond = NULL; + simdata->argc = 0; + simdata->argv = NULL; + + simdata->context = xbt_context_new(NULL, NULL, NULL, + SIMIX_process_cleanup, process, + /* argc/argv*/0,NULL); + /* Process structure */ + process->name = xbt_strdup(name); + process->simdata = simdata; + process->data = data; + SIMIX_process_set_jprocess(process,jprocess); + SIMIX_process_set_jenv(process,jenv); + + xbt_swag_insert(process, host->simdata->process_list); + + /* *************** FIX du current_process !!! *************** */ + self = simix_global->current_process; + xbt_context_start(process->simdata->context); + simix_global->current_process = self; + + xbt_swag_insert(process,simix_global->process_list); + DEBUG2("Inserting %s(%s) in the to_run list",process->name, + host->name); + xbt_swag_insert(process,simix_global->process_to_run); + + return process; +} + /** \brief Kill a SIMIX process * @@ -108,7 +158,7 @@ void SIMIX_process_kill(smx_process_t process) { smx_simdata_process_t p_simdata = process->simdata; - DEBUG2("Killing %s on %s",process->name, p_simdata->host->name); + DEBUG2("Killing %s on %s",process->name, p_simdata->s_host->name); if (p_simdata->mutex) { xbt_swag_remove(process,p_simdata->mutex->sleeping); @@ -168,7 +218,7 @@ smx_host_t SIMIX_process_get_host(smx_process_t process) { xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters"); - return (process->simdata->host); + return (process->simdata->s_host); } /** @@ -310,4 +360,33 @@ int SIMIX_process_is_suspended(smx_process_t process) } +/* Helper functions for jMSG: manipulate the context data without breaking the module separation */ +#include "xbt/context.h" /* to pass java objects from MSG to the context */ +void SIMIX_process_set_jprocess(smx_process_t process, void *jp) { + xbt_context_set_jprocess(process->simdata->context,jp); +} +void* SIMIX_process_get_jprocess(smx_process_t process) { + return xbt_context_get_jprocess(process->simdata->context); +} + +void SIMIX_process_set_jmutex(smx_process_t process, void *jm) { + xbt_context_set_jmutex(process->simdata->context,jm); +} +void* SIMIX_process_get_jmutex(smx_process_t process) { + return xbt_context_get_jmutex(process->simdata->context); +} + +void SIMIX_process_set_jcond(smx_process_t process, void *jc) { + xbt_context_set_jcond(process->simdata->context,jc); +} +void* SIMIX_process_get_jcond(smx_process_t process) { + return xbt_context_get_jcond(process->simdata->context); +} + +void SIMIX_process_set_jenv(smx_process_t process, void *je) { + xbt_context_set_jenv(process->simdata->context,je); +} +void* SIMIX_process_get_jenv(smx_process_t process) { + return xbt_context_get_jenv(process->simdata->context); +}