From: Adrien Lebre Date: Thu, 7 Aug 2014 12:39:26 +0000 (+0200) Subject: Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid X-Git-Tag: v3_12~858 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/70df654bdb90d3fe386b8cc29740d4cd990d2a0d?hp=3f7e571cee1225fe13ada069f04754b56b8a67a4 Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid --- diff --git a/.gitignore b/.gitignore index 81a91660f7..e668f32986 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,21 @@ buildtools/Cmake/test_prog/prog_va_copy.c *.bpr *.bpf ### Documentation +doc/allclasses-frame.html +doc/allclasses-noframe.html +doc/constant-values.html +doc/deprecated-list.html +doc/help-doc.html +doc/index-all.html +doc/index.html +doc/org/ +doc/overview-frame.html +doc/overview-summary.html +doc/overview-tree.html +doc/package-list +doc/resources/ +doc/serialized-form.html +doc/stylesheet.css doc/all_bib.html doc/logcategories.sh doc/realtoc.sh @@ -116,6 +131,7 @@ examples/msg/toto.txt examples/msg/z_gtnets.trace examples/msg/gpu/test_MSG_gpu_task_create examples/msg/cloud/bound +examples/msg/cloud/master_worker_vm examples/msg/cloud/migrate_vm examples/msg/cloud/multicore examples/msg/cloud/scale @@ -136,6 +152,7 @@ examples/msg/tracing/tasks examples/msg/tracing/volume examples/msg/io/file examples/msg/io/file_unlink +examples/msg/io/remote examples/msg/io/storage examples/msg/mc/bugged3 examples/msg/mc/test/snapshot_comparison1 @@ -756,6 +773,7 @@ teshsuite/xbt/mmalloc/mmalloc_test teshsuite/xbt/parallel_log_crashtest teshsuite/msg/storage/concurrent_rw teshsuite/msg/host_on_off/host_on_off +teshsuite/msg/host_on_off_processes/host_on_off_processes teshsuite/msg/process/process teshsuite/msg/process_join/process_join teshsuite/msg/storage/storage_basic @@ -838,5 +856,6 @@ examples/java/startKillTime/java_startKillTime_compiled examples/java/suspend/java_suspend_compiled examples/java/tracing/java_tracing_compiled examples/java/reservationSurfPlugin/java_reservation_surf_plugin_compiled +examples/java/surfCpuModel/java_surf_cpu_model_compiled examples/java/surfPlugin/java_surf_plugin_compiled /CMakeCache.txt diff --git a/ChangeLog b/ChangeLog index 0c46ad1a6f..f820250b94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ SimGrid (3.12) NOT RELEASED; urgency=low - (to complete) + SIMIX: + * New functions + - SIMIX_process_throw: raises an exception in a remote process + -- $date Da SimGrid team diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 0c18d61a27..fca1fb251f 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -994,6 +994,7 @@ set(EXAMPLES_CMAKEFILES_TXT examples/msg/energy/e1/CMakeLists.txt examples/msg/energy/e2/CMakeLists.txt examples/msg/energy/e3/CMakeLists.txt + examples/msg/exception/CMakeLists.txt examples/msg/gpu/CMakeLists.txt examples/msg/gtnets/CMakeLists.txt examples/msg/icomms/CMakeLists.txt diff --git a/buildtools/Cmake/MakeExe.cmake b/buildtools/Cmake/MakeExe.cmake index 60b58fb79a..27061c8ba9 100644 --- a/buildtools/Cmake/MakeExe.cmake +++ b/buildtools/Cmake/MakeExe.cmake @@ -36,6 +36,7 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/cloud) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e1) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e2) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e3) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/exception) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/gpu) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/icomms) diff --git a/examples/msg/exception/CMakeLists.txt b/examples/msg/exception/CMakeLists.txt new file mode 100644 index 0000000000..53ba5786a5 --- /dev/null +++ b/examples/msg/exception/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 2.6) + +set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(exception exception.c) + +### Add definitions for compile +target_link_libraries(exception simgrid) + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/exception.tesh + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${CMAKE_CURRENT_SOURCE_DIR}/exception.c + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + ${CMAKE_CURRENT_SOURCE_DIR}/deployment_exception.xml + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/examples/msg/exception/deployment_exception.xml b/examples/msg/exception/deployment_exception.xml new file mode 100644 index 0000000000..26b035dfb9 --- /dev/null +++ b/examples/msg/exception/deployment_exception.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/examples/msg/exception/exception.c b/examples/msg/exception/exception.c new file mode 100644 index 0000000000..044b0f1f30 --- /dev/null +++ b/examples/msg/exception/exception.c @@ -0,0 +1,125 @@ +/* Copyright (c) 2007, 2009-2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "msg/msg.h" +#include "xbt.h" + +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test_exception, + "Messages specific for this msg example"); + +/** @addtogroup MSG_examples + * + * - exception/exception.c: Demonstrates how to send an exception to a remote guy + */ + +/** Victim. This process gets a lot of remote exceptions */ +static int victim(int argc, char *argv[]) { + + xbt_ex_t e; + XBT_INFO("Let's get suspended."); + TRY { + MSG_process_suspend(MSG_process_self()); + } CATCH(e) { + XBT_INFO("The received exception resumed my execution. Good. Here is it: ----------------------->8----"); + xbt_ex_display(&e); + XBT_INFO("(end of the first exception) ----8<------------------------"); + xbt_ex_free(e); + } + + msg_error_t res = MSG_OK; + int gotit = 0; + XBT_INFO("Let's sleep for 10 seconds."); + TRY { + res = MSG_process_sleep(10); + } CATCH(e) { + XBT_INFO("Got the second exception: ----------------------->8----"); + xbt_ex_display(&e); + XBT_INFO("(end of the second exception) ----8<------------------------"); + xbt_ex_free(e); + } + + if (res != MSG_TASK_CANCELED) + xbt_die("Sleep action not canceled through the exception. This is not a method. (retval: %d)",res); + if (!gotit) + xbt_die("I was expecting to get an exception during my nap."); + XBT_INFO("My little nap got canceled through a raw exception. Excellent."); + + XBT_INFO("That's enough now. I quit."); + return 0; +} + +/** Terrorist. This process sends a bunch of exceptions to the victim. */ +static int terrorist(int argc, char *argv[]) +{ + msg_process_t victim_process = NULL; + + XBT_INFO("Let's create a victim."); + victim_process = MSG_process_create("victim", victim, NULL, MSG_host_self()); + if (MSG_process_sleep(1) != MSG_OK) + xbt_die("What's going on??? I failed to sleep!"); + XBT_INFO("Send a first exception (host failure)"); + SIMIX_process_throw(victim_process, host_error, 0, "Let's pretend that the host failed"); + + if (MSG_process_sleep(3) != MSG_OK) + xbt_die("What's going on??? I failed to sleep!"); + XBT_INFO("Send a second exception (cancellation)"); + SIMIX_process_throw(victim_process, cancel_error, 0, "Let's pretend this time that someone canceled something"); + + XBT_INFO("OK, goodbye now."); + return 0; +} + +int main(int argc, char *argv[]) { + msg_error_t res = MSG_OK; + + MSG_init(&argc, argv); + if (argc < 3) { + XBT_CRITICAL("Usage: %s platform_file deployment_file\n", argv[0]); + exit(1); + } + + MSG_function_register("terrorist", terrorist); + MSG_create_environment(argv[1]); + MSG_launch_application(argv[2]); + + /* + // Simplistic platform with only one host + sg_platf_begin(); + s_sg_platf_AS_cbarg_t AS = SG_PLATF_AS_INITIALIZER; + sg_platf_new_AS_begin(&AS); + + s_sg_platf_host_cbarg_t host = SG_PLATF_HOST_INITIALIZER; + host.id = "host0"; + sg_platf_new_host(&host); + + sg_platf_new_AS_end(); + sg_platf_end(); + + // Add one process -- super heavy just to launch an application! + SIMIX_init_application(); + sg_platf_begin(); + + s_sg_platf_process_cbarg_t process = SG_PLATF_PROCESS_INITIALIZER; + process.argc=1; + process.argv = malloc(sizeof(char*)*2); + process.argv[0] = "terrorist"; + process.argv[1] = NULL; + process.host = "host0"; + process.function = "terrorist"; + process.start_time = 0; + sg_platf_new_process(&process); + sg_platf_end(); +*/ + + // Launch the simulation + res = MSG_main(); + + XBT_INFO("Simulation time %g", MSG_get_clock()); + if (res == MSG_OK) + return 0; + else + return 1; +} diff --git a/examples/msg/exception/exception.tesh b/examples/msg/exception/exception.tesh new file mode 100644 index 0000000000..cf8cdb2819 --- /dev/null +++ b/examples/msg/exception/exception.tesh @@ -0,0 +1,6 @@ +#! ./tesh + +p Testing the remote exception raising feature + +! output sort +$ $SG_TEST_EXENV exception/exception ${srcdir:=.}/../platforms/platform.xml ${srcdir:=.}/exception/deployment_exception.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" diff --git a/include/simgrid/platf.h b/include/simgrid/platf.h index edcd3016ac..4da5c79b18 100644 --- a/include/simgrid/platf.h +++ b/include/simgrid/platf.h @@ -317,7 +317,7 @@ typedef struct s_sg_platf_process_cbarg { e_surf_process_on_failure_t on_failure; } s_sg_platf_process_cbarg_t; -#define SG_PLATF_PROCESS_INITIALIZER {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} +#define SG_PLATF_PROCESS_INITIALIZER {NULL,0,NULL,NULL,NULL,-1.0,-1.0,SURF_PROCESS_ON_FAILURE_DIE} typedef struct s_sg_platf_AS_cbarg *sg_platf_AS_cbarg_t; typedef struct s_sg_platf_AS_cbarg { diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index 0af82124a8..e5c979a37c 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -373,6 +373,8 @@ XBT_PUBLIC(void) simcall_process_create(smx_process_t *process, XBT_PUBLIC(void) simcall_process_kill(smx_process_t process); XBT_PUBLIC(void) simcall_process_killall(int reset_pid); +XBT_PUBLIC(void) SIMIX_process_throw(smx_process_t process, xbt_errcat_t cat, int value, const char *msg); + /* Process handling */ XBT_PUBLIC(void) simcall_process_cleanup(smx_process_t process); diff --git a/include/xbt/ex.h b/include/xbt/ex.h index dd79d3286d..a72f16b120 100644 --- a/include/xbt/ex.h +++ b/include/xbt/ex.h @@ -471,6 +471,8 @@ XBT_PUBLIC( void )__xbt_ex_terminate_default(xbt_ex_t * e); /** @brief Exception destructor */ XBT_PUBLIC(void) xbt_ex_free(xbt_ex_t e); +/** @brief The display made by an exception that is not catched */ +XBT_PUBLIC(void) xbt_ex_display(xbt_ex_t * e); /** @brief Shows a backtrace of the current location */ XBT_PUBLIC(void) xbt_backtrace_display_current(void); diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index df8c0d3583..73c91df534 100644 --- a/src/msg/msg_gos.c +++ b/src/msg/msg_gos.c @@ -173,7 +173,7 @@ msg_error_t MSG_process_sleep(double nb_sec) // adsein: MSG_TASK_CANCELED is assigned when someone kills the process that made the sleep, this is not // correct. For instance, when the node is turned off, the error should be MSG_HOST_FAILURE, which is by the way // and according to the JAVA document, the only exception that can be triggered by MSG_Process_sleep call. - // To avoid possible impacts in the code, I just raised a host_failure execption for the moment in the JAVA code + // To avoid possible impacts in the code, I just raised a host_failure exception for the moment in the JAVA code // and did not change anythings at the C level. // See comment in the jmsg_process.c file, function JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_sleep(JNIEnv *env, jclass cls, jlong jmillis, jint jnanos) status = MSG_TASK_CANCELED; diff --git a/src/simix/smx_deployment.c b/src/simix/smx_deployment.c index d1fcee1a94..5602ad6504 100644 --- a/src/simix/smx_deployment.c +++ b/src/simix/smx_deployment.c @@ -194,8 +194,7 @@ void SIMIX_process_set_function(const char *process_host, double process_start_time, double process_kill_time) { - s_sg_platf_process_cbarg_t process; - memset(&process,0,sizeof(process)); + s_sg_platf_process_cbarg_t process = SG_PLATF_PROCESS_INITIALIZER; smx_host_t host = SIMIX_host_get_by_name(process_host); if (!host) @@ -220,8 +219,6 @@ void SIMIX_process_set_function(const char *process_host, process.host = process_host; process.kill_time = process_kill_time; process.start_time = process_start_time; - process.on_failure = SURF_PROCESS_ON_FAILURE_DIE; - process.properties = NULL; sg_platf_new_process(&process); } diff --git a/src/simix/smx_private.h b/src/simix/smx_private.h index b2e5375f4a..34cf63e69a 100644 --- a/src/simix/smx_private.h +++ b/src/simix/smx_private.h @@ -71,11 +71,11 @@ XBT_PUBLIC(void) SIMIX_clean(void); #endif /******************************** Exceptions *********************************/ - -#define SMX_EXCEPTION(issuer, c, v, m) \ +/** @brief Ask to the provided simix process to raise the provided exception */ +#define SMX_EXCEPTION(issuer, cat, val, msg) \ if (1) { \ - smx_process_t _smx_throw_issuer = (issuer); \ - THROW_PREPARE(_smx_throw_issuer->running_ctx, (c), (v), xbt_strdup(m)); \ + smx_process_t _smx_throw_issuer = (issuer); /* evaluate only once */\ + THROW_PREPARE(_smx_throw_issuer->running_ctx, (cat), (val), xbt_strdup(msg)); \ _smx_throw_issuer->doexception = 1; \ } else ((void)0) diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 8d2320a51b..adf8d9d4ed 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -332,7 +332,7 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) { process->context->iwannadie = 1; process->blocked = 0; process->suspended = 0; - /* FIXME: set doexception to 0 also? */ + process->doexception = 0; /* destroy the blocking action if any */ if (process->waiting_action) { @@ -382,6 +382,64 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) { } +/** @brief Ask another process to raise the given exception + * + * @param cat category of exception + * @param value value associated to the exception + * @param msg string information associated to the exception + */ +void SIMIX_process_throw(smx_process_t process, xbt_errcat_t cat, int value, const char *msg) { + SMX_EXCEPTION(process, cat, value, msg); + + if (process->suspended) + SIMIX_process_resume(process,SIMIX_process_self()); + + /* cancel the blocking action if any */ + if (process->waiting_action) { + + switch (process->waiting_action->type) { + + case SIMIX_ACTION_EXECUTE: + case SIMIX_ACTION_PARALLEL_EXECUTE: + SIMIX_host_execution_cancel(process->waiting_action); + break; + + case SIMIX_ACTION_COMMUNICATE: + xbt_fifo_remove(process->comms, process->waiting_action); + SIMIX_comm_cancel(process->waiting_action); + break; + + case SIMIX_ACTION_SLEEP: + SIMIX_process_sleep_destroy(process->waiting_action); + break; + + case SIMIX_ACTION_JOIN: + SIMIX_process_sleep_destroy(process->waiting_action); + break; + + case SIMIX_ACTION_SYNCHRO: + SIMIX_synchro_stop_waiting(process, &process->simcall); + break; + + case SIMIX_ACTION_IO: + SIMIX_io_destroy(process->waiting_action); + break; + + /* **************************************/ + /* TUTORIAL: New API */ + case SIMIX_ACTION_NEW_API: + SIMIX_new_api_destroy(process->waiting_action); + break; + /* **************************************/ + + } + } + process->waiting_action = NULL; + + if (!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != SIMIX_process_self()) + xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process); +} + void SIMIX_pre_process_killall(smx_simcall_t simcall, int reset_pid) { SIMIX_process_killall(simcall->issuer, reset_pid); } @@ -494,8 +552,6 @@ void SIMIX_pre_process_resume(smx_simcall_t simcall, smx_process_t process){ void SIMIX_process_resume(smx_process_t process, smx_process_t issuer) { - xbt_assert((process != NULL), "Invalid parameters"); - XBT_IN("process = %p, issuer = %p", process, issuer); if(process->context->iwannadie) { @@ -844,7 +900,7 @@ void SIMIX_process_yield(smx_process_t self) if (self->suspended) { XBT_DEBUG("Hey! I'm suspended."); - xbt_assert(!self->doexception, "Gloups! This exception may be lost by subsequent calls."); + xbt_assert(!self->doexception, "Gasp! This exception may be lost by subsequent calls."); self->suspended = 0; SIMIX_process_suspend(self, self); } diff --git a/src/xbt/ex.c b/src/xbt/ex.c index 4b0d7bdf1c..a543fb8fce 100644 --- a/src/xbt/ex.c +++ b/src/xbt/ex.c @@ -133,6 +133,8 @@ void xbt_backtrace_display_current(void) void xbt_ex_display(xbt_ex_t * e) { char *thrower = NULL; + if (e->pid != xbt_getpid()) + thrower = bprintf(" on process %d",e->pid); fprintf(stderr, "** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n" @@ -177,8 +179,7 @@ void __xbt_ex_terminate_default(xbt_ex_t * e) /* the externally visible API */ XBT_EXPORT_NO_IMPORT(xbt_running_ctx_fetcher_t) __xbt_running_ctx_fetch = &__xbt_ex_ctx_default; -XBT_EXPORT_NO_IMPORT(ex_term_cb_t) __xbt_ex_terminate = - &__xbt_ex_terminate_default; +XBT_EXPORT_NO_IMPORT(ex_term_cb_t) __xbt_ex_terminate = &__xbt_ex_terminate_default; void xbt_ex_free(xbt_ex_t e) diff --git a/src/xbt/ex_interface.h b/src/xbt/ex_interface.h index 3abaede608..4f510f6815 100644 --- a/src/xbt/ex_interface.h +++ b/src/xbt/ex_interface.h @@ -12,8 +12,6 @@ #define _XBT_EX_INTERFACE_H_ #include "xbt/ex.h" -/* The display made by an uncatched exception */ -void xbt_ex_display(xbt_ex_t * e); /* Change raw libc symbols to file names and line numbers */ void xbt_ex_setup_backtrace(xbt_ex_t * e);