X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bc0c0b491241f28c083c4b6540944ed604242ba2..301a28e1a96c21b0581abc2dd632952e3c5d0ff8:/src/gras/Virtu/sg_process.c diff --git a/src/gras/Virtu/sg_process.c b/src/gras/Virtu/sg_process.c index f985c86f31..e1cac963bc 100644 --- a/src/gras/Virtu/sg_process.c +++ b/src/gras/Virtu/sg_process.c @@ -8,6 +8,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "xbt/ex.h" +#include "xbt/dict.h" #include "gras_modinter.h" /* module initialization interface */ #include "gras/Virtu/virtu_sg.h" #include "gras/Msg/msg_interface.h" /* For some checks at simulation end */ @@ -19,12 +20,12 @@ static long int PID = 1; void gras_agent_spawn(const char *name, void *data, - xbt_main_func_t code, int argc, char *argv[]) { + xbt_main_func_t code, int argc, char *argv[], xbt_dict_t properties) { SIMIX_process_create(name, code, data, gras_os_myname(), - argc, argv); + argc, argv, properties); } /* ************************************************************************** @@ -52,24 +53,21 @@ gras_process_init() { hd->refcount++; } - trp_pd = (gras_trp_procdata_t)gras_libdata_by_name("gras_trp"); - pd->pid = PID++; - - if (SIMIX_process_self() != NULL ) { - pd->ppid = gras_os_getpid(); - } - else pd->ppid = -1; - - trp_pd->mutex = SIMIX_mutex_init(); - trp_pd->cond = SIMIX_cond_init(); - trp_pd->mutex_meas = SIMIX_mutex_init(); - trp_pd->cond_meas = SIMIX_cond_init(); - trp_pd->active_socket = xbt_fifo_new(); - trp_pd->active_socket_meas = xbt_fifo_new(); - + trp_pd = (gras_trp_procdata_t)gras_libdata_by_name("gras_trp"); + pd->pid = PID++; + + if (SIMIX_process_self() != NULL ) { + pd->ppid = gras_os_getpid(); + } + else pd->ppid = -1; + + trp_pd->msg_selectable_sockets = xbt_queue_new(0,sizeof(gras_socket_t)); + + trp_pd->meas_selectable_sockets = xbt_queue_new(0,sizeof(gras_socket_t)); + VERB2("Creating process '%s' (%d)", - SIMIX_process_get_name(SIMIX_process_self()), - gras_os_getpid()); + SIMIX_process_get_name(SIMIX_process_self()), + gras_os_getpid()); } void @@ -77,18 +75,19 @@ gras_process_exit() { xbt_dynar_t sockets = ((gras_trp_procdata_t) gras_libdata_by_name("gras_trp"))->sockets; gras_socket_t sock_iter; int cursor; - gras_hostdata_t *hd=(gras_hostdata_t *)SIMIX_host_get_data(SIMIX_host_self()); - gras_procdata_t *pd=(gras_procdata_t*)SIMIX_process_get_data(SIMIX_process_self()); + gras_hostdata_t *hd= + (gras_hostdata_t *)SIMIX_host_get_data(SIMIX_host_self()); + gras_procdata_t *pd= + (gras_procdata_t*)SIMIX_process_get_data(SIMIX_process_self()); + + gras_msg_procdata_t msg_pd= + (gras_msg_procdata_t)gras_libdata_by_name("gras_msg"); + gras_trp_procdata_t trp_pd= + (gras_trp_procdata_t)gras_libdata_by_name("gras_trp"); - gras_msg_procdata_t msg_pd=(gras_msg_procdata_t)gras_libdata_by_name("gras_msg"); - gras_trp_procdata_t trp_pd=(gras_trp_procdata_t)gras_libdata_by_name("gras_trp"); + xbt_queue_free(&trp_pd->msg_selectable_sockets); - SIMIX_mutex_destroy(trp_pd->mutex); - SIMIX_cond_destroy(trp_pd->cond); - xbt_fifo_free(trp_pd->active_socket); - SIMIX_mutex_destroy(trp_pd->mutex_meas); - SIMIX_cond_destroy(trp_pd->cond_meas); - xbt_fifo_free(trp_pd->active_socket_meas); + xbt_queue_free(&trp_pd->meas_selectable_sockets); xbt_assert0(hd,"Run gras_process_init (ie, gras_init)!!"); @@ -99,13 +98,14 @@ gras_process_exit() { if (xbt_dynar_length(msg_pd->msg_queue)) WARN1("process %d terminated, but some messages are still queued", gras_os_getpid()); - - /* if each process has its sockets list, we need to close them when the process finish */ - xbt_dynar_foreach(sockets,cursor,sock_iter) { - VERB1("Closing the socket %p left open on exit. Maybe a socket leak?", - sock_iter); - gras_socket_close(sock_iter); - } + + /* if each process has its sockets list, we need to close them when the + process finish */ + xbt_dynar_foreach(sockets,cursor,sock_iter) { + VERB1("Closing the socket %p left open on exit. Maybe a socket leak?", + sock_iter); + gras_socket_close(sock_iter); + } if ( ! --(hd->refcount)) { xbt_dynar_free(&hd->ports); free(hd); @@ -137,6 +137,19 @@ gras_libdata_by_name_from_remote(const char *name, smx_process_t p) { return gras_libdata_by_name_from_procdata(name, pd); } +/** @brief retrieve the value of a given process property (or NULL if not defined) */ +const char* gras_process_property_value(const char* name) { + return xbt_dict_get_or_null(SIMIX_process_get_properties(SIMIX_process_self()), name); +} + +/** @brief retrieve the process properties dictionnary + * @warning it's the original one, not a copy. Don't mess with it + */ +xbt_dict_t gras_process_properties(void) +{ + return SIMIX_process_get_properties(SIMIX_process_self()); +} + /* ************************************************************************** * OS virtualization function * **************************************************************************/ @@ -162,63 +175,73 @@ int gras_os_getpid(void) { return 0; } + +/** @brief retrieve the value of a given host property (or NULL if not defined) */ +const char* gras_os_host_property_value(const char* name) { + return xbt_dict_get_or_null(SIMIX_host_get_properties(SIMIX_process_get_host(SIMIX_process_self())), name); +} + +/** @brief retrieve the host properties dictionnary + * @warning it's the original one, not a copy. Don't mess with it + */ +xbt_dict_t gras_os_host_properties(void) { + return SIMIX_host_get_properties(SIMIX_process_get_host(SIMIX_process_self())); +} + /* ************************************************************************** * Interface with SIMIX * **************************************************************************/ void gras_global_init(int *argc,char **argv) { - return SIMIX_global_init(argc,argv); + SIMIX_global_init(argc,argv); } void gras_create_environment(const char *file) { - return SIMIX_create_environment(file); + SIMIX_create_environment(file); } void gras_function_register(const char *name, xbt_main_func_t code) { - return SIMIX_function_register(name, code); + SIMIX_function_register(name, code); } -void gras_main() { - smx_cond_t cond = NULL; - smx_action_t smx_action; - xbt_fifo_t actions_done = xbt_fifo_new(); - xbt_fifo_t actions_failed = xbt_fifo_new(); - - /* Clean IO before the run */ - fflush(stdout); - fflush(stderr); - +void gras_main() { + smx_cond_t cond = NULL; + smx_action_t action; + xbt_fifo_t actions_done = xbt_fifo_new(); + xbt_fifo_t actions_failed = xbt_fifo_new(); - while (SIMIX_solve(actions_done, actions_failed) != -1.0) { - - while ( (smx_action = xbt_fifo_pop(actions_failed)) ) { - - - DEBUG1("** %s failed **",smx_action->name); - while ( (cond = xbt_fifo_pop(smx_action->cond_list)) ) { - SIMIX_cond_broadcast(cond); - } - /* action finished, destroy it */ - // SIMIX_action_destroy(smx_action); + /* Clean IO before the run */ + fflush(stdout); + fflush(stderr); + + while (SIMIX_solve(actions_done, actions_failed) != -1.0) { + while ( (action = xbt_fifo_pop(actions_failed)) ) { + DEBUG1("** %s failed **",action->name); + while ( (cond = xbt_fifo_pop(action->cond_list)) ) { + SIMIX_cond_broadcast(cond); } - - while ( (smx_action = xbt_fifo_pop(actions_done)) ) { - - DEBUG1("** %s done **",smx_action->name); - while ( (cond = xbt_fifo_pop(smx_action->cond_list)) ) { - SIMIX_cond_broadcast(cond); - } - /* action finished, destroy it */ - //SIMIX_action_destroy(smx_action); + /* action finished, destroy it */ + // SIMIX_action_destroy(action); + } + + while ( (action = xbt_fifo_pop(actions_done)) ) { + DEBUG1("** %s done **",action->name); + while ( (cond = xbt_fifo_pop(action->cond_list)) ) { + SIMIX_cond_broadcast(cond); } - } - xbt_fifo_free(actions_failed); - xbt_fifo_free(actions_done); - return; + /* action finished, destroy it */ + //SIMIX_action_destroy(action); + } + } + xbt_fifo_free(actions_failed); + xbt_fifo_free(actions_done); + return; } + void gras_launch_application(const char *file) { - return SIMIX_launch_application(file); + SIMIX_launch_application(file); } + void gras_clean() { - return SIMIX_clean(); + SIMIX_clean(); }