X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ae66e43b95b26467c1cb9df271e83f51d3d7147b..d6fe500813d00b30525b071d9038a7edf7104267:/src/gras/Virtu/sg_process.c diff --git a/src/gras/Virtu/sg_process.c b/src/gras/Virtu/sg_process.c index 017d860f09..6f09110c0e 100644 --- a/src/gras/Virtu/sg_process.c +++ b/src/gras/Virtu/sg_process.c @@ -17,6 +17,21 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_virtu_process); static long int PID = 1; + +void gras_agent_spawn(const char *name, void *data, + xbt_main_func_t code, int argc, char *argv[]) { + + SIMIX_process_create(name, code, + data, + gras_os_myname(), + argc, argv, + /* no cleanup, thx, users will call gras_exit() */NULL); +} + +/* ************************************************************************** + * Process constructor/destructor (semi-public interface) + * **************************************************************************/ + void gras_process_init() { gras_hostdata_t *hd=(gras_hostdata_t *)SIMIX_host_get_data(SIMIX_host_self()); @@ -48,9 +63,12 @@ gras_process_init() { 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(); - VERB2("Creating process '%s' (%ld)", + VERB2("Creating process '%s' (%d)", SIMIX_process_get_name(SIMIX_process_self()), gras_os_getpid()); } @@ -69,17 +87,18 @@ gras_process_exit() { SIMIX_mutex_destroy(trp_pd->mutex); SIMIX_cond_destroy(trp_pd->cond); xbt_fifo_free(trp_pd->active_socket); - //int myPID=gras_os_getpid(); - //int cpt; - //gras_sg_portrec_t pr; + SIMIX_mutex_destroy(trp_pd->mutex_meas); + SIMIX_cond_destroy(trp_pd->cond_meas); + xbt_fifo_free(trp_pd->active_socket_meas); + xbt_assert0(hd,"Run gras_process_init (ie, gras_init)!!"); - VERB2("GRAS: Finalizing process '%s' (%ld)", + VERB2("GRAS: Finalizing process '%s' (%d)", SIMIX_process_get_name(SIMIX_process_self()),gras_os_getpid()); if (xbt_dynar_length(msg_pd->msg_queue)) - WARN1("process %ld terminated, but some messages are still queued", + 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 */ @@ -97,7 +116,7 @@ gras_process_exit() { } /* ************************************************************************** - * Process data + * Process data (public interface) * **************************************************************************/ gras_procdata_t *gras_procdata_get(void) { @@ -118,7 +137,11 @@ gras_libdata_by_name_from_remote(const char *name, smx_process_t p) { return gras_libdata_by_name_from_procdata(name, pd); } - + +/* ************************************************************************** + * OS virtualization function + * **************************************************************************/ + const char* xbt_procname(void) { const char *res = NULL; smx_process_t process = SIMIX_process_self(); @@ -130,12 +153,73 @@ const char* xbt_procname(void) { return ""; } -long int gras_os_getpid(void) { +int gras_os_getpid(void) { smx_process_t process = SIMIX_process_self(); if ((process != NULL) && (process->data)) - return ((gras_procdata_t*)process->data)->pid; + return ((gras_procdata_t*)process->data)->pid; else return 0; } + +/* ************************************************************************** + * Interface with SIMIX + * **************************************************************************/ + +void gras_global_init(int *argc,char **argv) { + return SIMIX_global_init(argc,argv); +} +void gras_create_environment(const char *file) { + return SIMIX_create_environment(file); +} +void gras_function_register(const char *name, xbt_main_func_t code) { + return 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); + + + 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); + } + + 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); + } + } + xbt_fifo_free(actions_failed); + xbt_fifo_free(actions_done); + return; +} +void gras_launch_application(const char *file) { + return SIMIX_launch_application(file); +} +void gras_clean() { + return SIMIX_clean(); +} + +