From: Frederic Suter Date: Tue, 5 Mar 2019 08:22:35 +0000 (+0100) Subject: Merge branch 'master' of https://framagit.org/simgrid/simgrid X-Git-Tag: v3_22~180 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/4d02714ee138a3bd9b02e0064b7a2aa26407e9e8?hp=a44ff15a6114ee1fbcb9a8f9b1269fea19806013 Merge branch 'master' of https://framagit.org/simgrid/simgrid --- diff --git a/.appveyor.yml b/.appveyor.yml index cd7a0966bf..7ef6a3075a 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -47,7 +47,7 @@ build_script: - mingw32-make.exe VERBOSE=1 java-all python-bindings # Only the Java and Python parts - ctest --output-on-failure -R java # Don't test python, as pybind11 seems too complex for mingw for now (mingw-w64/x86_64-7.2.0-posix-seh-rt_v5-rev1) -# The observed failure is around the StopRequest exception, that seems badly catched somehow. +# The observed failure is around the ForcefulKill exception, that seems badly catched somehow. # - ctest --output-on-failure -R python artifacts: diff --git a/ChangeLog b/ChangeLog index dadeec766e..28d9dd1594 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19,6 +19,9 @@ MSG: - Hide the examples into examples/deprecated. New users should use S4U. - MSG_process_create and MSG_process_attach now crash if the host used to run this process is off. + - Fix the protype of MSG_process_on_exit() + Now use (int,void*) callbacks instead of (void*,void*) ones. + The implementation was ways too messy to actually work, I guess. XBT: - Drop sg_cmdline. Please use xbt_cmdline instead. @@ -38,6 +41,10 @@ XML - In and , availability_file is now speed_file. XML file version remains 4.2 since old files are still compatible. +Internal: + - Many cleanups in the kernel::activity namespace. This was long + overdue, and shall open the path to many future endeavors. + Fixed bugs: - #132: Java : a process can not shut down its own host - #261: Document the parameters of parallel execution's constructor diff --git a/doc/doxygen/platform.doc b/doc/doxygen/platform.doc index 5b0cc668cc..21121e1e29 100644 --- a/doc/doxygen/platform.doc +++ b/doc/doxygen/platform.doc @@ -1,62 +1,11 @@ /*! @page platform Describing the virtual platform -@tableofcontents - -@htmlonly -
-@endhtmlonly -@htmlinclude graphical-toc.svg -@htmlonly -
- -@endhtmlonly - -As @ref starting_components "explained in the introduction," any -SimGrid study must entail the description of the platform on which you -want to simulate your application. You have to describe **each element -of your platform**, such as computing hosts, clusters, each disks, -links, etc. You must also define the **routing on your platform**, ie -which path is taken between two hosts. Finally, you may also describe -an **experimental scenario**, with qualitative changes (e.g., -bandwidth changes representing an external load) and qualitative -changes (representing how some elements fail and restart over time). - -You should really separate your application from the platform -description, as it will ease your experimental campain afterward. -Mixing them is seen as a really bad experimental practice. The easiest -to enforce this split is to put the platform description in a XML -file. Many example platforms are provided in the archive, and this -page gives all needed details to write such files, as well as some -hints and tricks about describing your platform. - -On the other side, XML is sometimes not expressive enough for some -platforms, in particular large platforms exhibiting repetitive -patterns that are not simply expressed in XML. In practice, many -users end up generating their XML platform files from some sort of -scripts. It is probably preferable to rewrite your XML @ref -platform_lua "platform using the lua scripting language" instead. -In the future, it should be possible to describe the platform directly -in C++, but this is not possible yet. + As usual, SimGrid is a versatile framework, and you should find the way of describing your platform that best fits your experimental practice. -@section pf_overview Describing the platform with XML - -Your platform description should follow the specification presented in -the [simgrid.dtd](https://simgrid.org/simgrid.dtd) -DTD file. The same DTD is used for both the platform and deployment -files. - -From time to time, this DTD evolves to introduce possibly -backward-incompatible changes. That is why each platform desciption is -enclosed within a @c platform tag, that have a @c version attribute. -The current version is 4.1. The @c simgrid_update_xml program can -upgrade most of the past platform files to the recent formalism. - @section pf_first_example First Platform Example Here is a very simple platform file, containing 3 resources (two hosts @@ -79,8 +28,6 @@ and one link), and explicitly giving the route between the hosts. @endcode -As we said, the englobing @ref pf_overview "<platform>" tag is -used to specify the dtd version used for this file. Then, every resource (specified with @ref pf_tag_host, @ref pf_tag_link or others) must be located within a given **networking diff --git a/docs/source/community.rst b/docs/source/community.rst index f57ae3a456..fe4daddf94 100644 --- a/docs/source/community.rst +++ b/docs/source/community.rst @@ -31,9 +31,9 @@ to us and say hello! We love earing about how people use SimGrid. list. - Join us on IRC and ask your question directly on the channel \#simgrid at ``irc.debian.org`` - (or use the ugly `web interface `_) + (or use the ugly `web interface `_ if you don't have a - `real client `_) + `real client `_ installed). When no non-french speaker are connected, we usually chat in french on this channel, but we do switch back to english when we have a guest. diff --git a/docs/source/platform.rst b/docs/source/platform.rst index 6e81d4d0f6..5c99228835 100644 --- a/docs/source/platform.rst +++ b/docs/source/platform.rst @@ -37,9 +37,14 @@ with qualitative changes (e.g., bandwidth changes representing an external load) and qualitative changes (representing how some elements fail and restart over time). + + Defining Basic Elements *********************** +These are the components of your platform. + + There is not much to say about the definition of basic elements. Just use the appropriate tags: :ref:`pf_tag_host`, :ref:`pf_tag_link` and :ref:`pf_tag_storage`. diff --git a/docs/source/platform_reference.rst b/docs/source/platform_reference.rst index d78a23a1af..70496ce7af 100644 --- a/docs/source/platform_reference.rst +++ b/docs/source/platform_reference.rst @@ -267,8 +267,26 @@ and a download link. :``state_file``: File containing the state profile. See the full description in :ref:`pf_tag_host` +.. _pf_tag_platform: - +------------------------------------------------------------------ + +------------------------------------------------------------------ + +**Parent tags:** none (this is the root tag of every file) |br| +**Children tags:** :ref:`pf_tag_config` (must come first), +:ref:`pf_tag_cluster`, :ref:`pf_tag_cabinet`, :ref:`pf_tag_peer`, +:ref:`pf_tag_zone`, :ref:`pf_tag_trace`, :ref:`pf_tag_trace_connect` |br| +**Attributes:** + +:``version``: Version of the DTD, describing the whole XML format. + This versionning allow future evolutions, even if we + avoid backward-incompatible changes. The current version + is **4.1**. The ``simgrid_update_xml`` program can + upgrade most of the past platform files to the recent + formalism. + + .. _pf_tag_prop: ------------------------------------------------------------------ diff --git a/examples/s4u/actor-exiting/s4u-actor-exiting.cpp b/examples/s4u/actor-exiting/s4u-actor-exiting.cpp index ac5042de55..d24aab7ce1 100644 --- a/examples/s4u/actor-exiting/s4u-actor-exiting.cpp +++ b/examples/s4u/actor-exiting/s4u-actor-exiting.cpp @@ -32,7 +32,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_actor_exiting, "Messages specific for this s4u static void actor_a() { // Register a lambda function to be executed once it stops - simgrid::s4u::this_actor::on_exit([](int, void*) { XBT_INFO("I stop now"); }, nullptr); + simgrid::s4u::this_actor::on_exit([](bool /*failed*/) { XBT_INFO("I stop now"); }); simgrid::s4u::this_actor::execute(1e9); } diff --git a/examples/s4u/actor-kill/s4u-actor-kill.cpp b/examples/s4u/actor-kill/s4u-actor-kill.cpp index 9c0f356462..3226e94cf8 100644 --- a/examples/s4u/actor-kill/s4u-actor-kill.cpp +++ b/examples/s4u/actor-kill/s4u-actor-kill.cpp @@ -9,7 +9,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_actor_kill, "Messages specific for this s4u exa static void victimA_fun() { - simgrid::s4u::this_actor::on_exit([](int, void*) { XBT_INFO("I have been killed!"); }, nullptr); + simgrid::s4u::this_actor::on_exit([](bool /*failed*/) { XBT_INFO("I have been killed!"); }); XBT_INFO("Hello!"); XBT_INFO("Suspending myself"); simgrid::s4u::this_actor::suspend(); /* - Start by suspending itself */ diff --git a/examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp b/examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp index 9f12c5505f..fb2990ff5b 100644 --- a/examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp +++ b/examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp @@ -16,12 +16,10 @@ class sleeper { public: explicit sleeper(std::vector /*args*/) { - simgrid::s4u::this_actor::on_exit( - [](int, void*) { - /* Executed on process termination, to display a message helping to understand the output */ - XBT_INFO("Exiting now (done sleeping or got killed)."); - }, - nullptr); + simgrid::s4u::this_actor::on_exit([](bool /*failed*/) { + /* Executed on process termination, to display a message helping to understand the output */ + XBT_INFO("Exiting now (done sleeping or got killed)."); + }); } void operator()() { diff --git a/include/simgrid/Exception.hpp b/include/simgrid/Exception.hpp index 321b9568d9..0f3a5e3a6d 100644 --- a/include/simgrid/Exception.hpp +++ b/include/simgrid/Exception.hpp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -164,6 +165,44 @@ public: } }; +class XBT_PUBLIC ForcefulKillException { + /** @brief Exception launched to kill an actor; DO NOT BLOCK IT! + * + * This exception is thrown whenever the actor's host is turned off. The actor stack is properly unwinded to release + * all objects allocated on the stack (RAII powa). + * + * You may want to catch this exception to perform some extra cleanups in your simulation, but YOUR ACTORS MUST NEVER + * SURVIVE a ForcefulKillException, or your simulation will segfault. + * + * @verbatim + * void* payload = malloc(512); + * + * try { + * simgrid::s4u::this_actor::execute(100000); + * } catch (simgrid::kernel::context::ForcefulKillException& e) { // oops, my host just turned off + * free(malloc); + * throw; // I shall never survive on an host that was switched off + * } + * @endverbatim + */ + /* Nope, Sonar, this should not inherit of std::exception nor of simgrid::Exception. + * Otherwise, users may accidentally catch it with a try {} catch (std::exception) + */ +public: + ForcefulKillException() = default; + explicit ForcefulKillException(const std::string& msg) : msg_(std::string("Actor killed (") + msg + std::string(").")) + { + } + ~ForcefulKillException(); + const char* what() const noexcept { return msg_.c_str(); } + + static void do_throw(); + static bool try_n_catch(std::function try_block); + +private: + std::string msg_ = std::string("Actor killed."); +}; + } // namespace simgrid #endif diff --git a/include/simgrid/msg.h b/include/simgrid/msg.h index daa868d20d..7a3e616dff 100644 --- a/include/simgrid/msg.h +++ b/include/simgrid/msg.h @@ -329,7 +329,7 @@ XBT_PUBLIC int MSG_process_get_number(); XBT_PUBLIC void* MSG_process_get_data(msg_process_t process); XBT_PUBLIC msg_error_t MSG_process_set_data(msg_process_t process, void* data); -XBT_PUBLIC void MSG_process_on_exit(int_f_pvoid_pvoid_t fun, void* data); +XBT_PUBLIC void MSG_process_on_exit(int_f_int_pvoid_t fun, void* data); XBT_PUBLIC void MSG_process_ref(msg_process_t process); XBT_PUBLIC void MSG_process_unref(msg_process_t process); diff --git a/include/simgrid/s4u/Actor.hpp b/include/simgrid/s4u/Actor.hpp index 7e5c4f1761..2b85f6db75 100644 --- a/include/simgrid/s4u/Actor.hpp +++ b/include/simgrid/s4u/Actor.hpp @@ -126,7 +126,7 @@ class XBT_PUBLIC Actor : public simgrid::xbt::Extendable { friend simgrid::kernel::actor::ActorImpl; friend simgrid::kernel::activity::MailboxImpl; - kernel::actor::ActorImpl* const pimpl_ = nullptr; + kernel::actor::ActorImpl* const pimpl_; explicit Actor(smx_actor_t pimpl) : pimpl_(pimpl) {} @@ -229,8 +229,12 @@ public: * Please note that functions registered in this signal cannot do any simcall themselves. It means that they cannot * send or receive messages, acquire or release mutexes, nor even modify a host property or something. Not only are * blocking functions forbidden in this setting, but also modifications to the global state. + * + * The parameter of on_exit's callbacks denotes whether or not the actor's execution failed. + * It will be set to true if the actor was killed or failed because of an exception, + * while it will remain to false if the actor terminated gracefully. */ - void on_exit(std::function fun, void* data); + void on_exit(std::function fun); /** Sets the time at which that actor should be killed */ void set_kill_time(double time); @@ -289,6 +293,9 @@ public: void set_property(const std::string& key, std::string value); #ifndef DOXYGEN + XBT_ATTRIB_DEPRECATED_v325("Please use Actor::on_exit(fun) instead") void on_exit(std::function fun, + void* data); + XBT_ATTRIB_DEPRECATED_v325("Please use Actor::by_pid(pid).kill() instead") static void kill(aid_t pid); /** @deprecated See Actor::create() */ @@ -345,7 +352,7 @@ public: /** @deprecated See Actor::on_exit() */ XBT_ATTRIB_DEPRECATED_v323("Please use Actor::on_exit()") void onExit(int_f_pvoid_pvoid_t fun, void* data) { - on_exit([fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data); + on_exit([fun, data](bool a) { fun((void*)(uintptr_t)a, data); }); } /** @deprecated See Actor::set_kill_time() */ XBT_ATTRIB_DEPRECATED_v323("Please use Actor::set_kill_time()") void setKillTime(double time) { set_kill_time(time); } @@ -517,8 +524,21 @@ XBT_PUBLIC void resume(); /** @brief kill the current actor. */ XBT_PUBLIC void exit(); -/** @brief Add a function to the list of "on_exit" functions of the current actor. */ -XBT_PUBLIC void on_exit(std::function fun, void* data); +/** @brief Add a function to the list of "on_exit" functions of the current actor. + * + * The on_exit functions are the functions executed when your actor is killed. You should use them to free the data used + * by your actor. + * + * Please note that functions registered in this signal cannot do any simcall themselves. It means that they cannot + * send or receive messages, acquire or release mutexes, nor even modify a host property or something. Not only are + * blocking functions forbidden in this setting, but also modifications to the global state. + * + * The parameter of on_exit's callbacks denotes whether or not the actor's execution failed. + * It will be set to true if the actor was killed or failed because of an exception, + * while it will remain to false if the actor terminated gracefully. + */ + +XBT_PUBLIC void on_exit(std::function fun); /** @brief Migrate the current actor to a new host. */ XBT_PUBLIC void migrate(Host* new_host); @@ -526,8 +546,11 @@ XBT_PUBLIC void migrate(Host* new_host); /** @} */ #ifndef DOXYGEN +XBT_ATTRIB_DEPRECATED_v325("Please use std::function for first parameter.") XBT_PUBLIC + void on_exit(std::function fun, void* data); + /** @deprecated Please use std::function for first parameter */ -XBT_ATTRIB_DEPRECATED_v323("Please use std::function for first parameter.") XBT_PUBLIC +XBT_ATTRIB_DEPRECATED_v323("Please use std::function for first parameter.") XBT_PUBLIC void on_exit(int_f_pvoid_pvoid_t fun, void* data); /** @deprecated See this_actor::get_name() */ XBT_ATTRIB_DEPRECATED_v323("Please use this_actor::get_name()") XBT_PUBLIC std::string getName(); diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index 647d9cd937..05f0e262eb 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -150,7 +150,8 @@ XBT_PUBLIC void SIMIX_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t f SG_END_DECL() #ifdef __cplusplus -XBT_PUBLIC void SIMIX_process_on_exit(smx_actor_t process, std::function fun, void* data); +XBT_PUBLIC void SIMIX_process_on_exit(smx_actor_t process, std::function fun, + void* data); #endif /****************************** Communication *********************************/ diff --git a/include/xbt/function_types.h b/include/xbt/function_types.h index b71e6abb90..84b8b3aac3 100644 --- a/include/xbt/function_types.h +++ b/include/xbt/function_types.h @@ -17,6 +17,7 @@ typedef void *(*pvoid_f_void_t) (void); typedef void *(*pvoid_f_pvoid_t) (void *); typedef void (*void_f_void_t) (void); +typedef int (*int_f_int_pvoid_t)(int, void*); typedef int (*int_f_pvoid_pvoid_t) (void *, void *); typedef int (*int_f_cpvoid_cpvoid_t) (const void *, const void *); diff --git a/src/bindings/java/jmsg.cpp b/src/bindings/java/jmsg.cpp index a98c6bd28c..ebe959756d 100644 --- a/src/bindings/java/jmsg.cpp +++ b/src/bindings/java/jmsg.cpp @@ -277,7 +277,7 @@ static void run_jprocess(JNIEnv *env, jobject jprocess) env->ExceptionClear(); XBT_ATTRIB_UNUSED jint error = __java_vm->DetachCurrentThread(); xbt_assert(error == JNI_OK, "Cannot detach failing thread"); - simgrid::kernel::context::StopRequest::do_throw(); + simgrid::ForcefulKillException::do_throw(); } } diff --git a/src/bindings/java/jmsg_host.cpp b/src/bindings/java/jmsg_host.cpp index eb9938c271..550c172ec5 100644 --- a/src/bindings/java/jmsg_host.cpp +++ b/src/bindings/java/jmsg_host.cpp @@ -5,6 +5,7 @@ /* 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 "simgrid/Exception.hpp" #include "simgrid/plugins/energy.h" #include "simgrid/plugins/load.h" #include "simgrid/s4u/Host.hpp" @@ -142,7 +143,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_on(JNIEnv *env, jobject jhost) JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_off(JNIEnv *env, jobject jhost) { msg_host_t host = jhost_get_native(env, jhost); - if (not simgrid::kernel::context::StopRequest::try_n_catch([host]() { MSG_host_off(host); })) + if (not simgrid::ForcefulKillException::try_n_catch([host]() { MSG_host_off(host); })) jxbt_throw_by_name(env, "org/simgrid/msg/ProcessKilledError", "Host turned off"); } diff --git a/src/bindings/java/jmsg_process.cpp b/src/bindings/java/jmsg_process.cpp index c20b3a4944..0cfc8057dd 100644 --- a/src/bindings/java/jmsg_process.cpp +++ b/src/bindings/java/jmsg_process.cpp @@ -229,8 +229,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_sleep(JNIEnv *env, jclass cl { double time = ((double)jmillis) / 1000 + ((double)jnanos) / 1000000000; msg_error_t rv = MSG_OK; - if (not simgrid::kernel::context::StopRequest::try_n_catch( - [&time]() { simgrid::s4u::this_actor::sleep_for(time); })) { + if (not simgrid::ForcefulKillException::try_n_catch([&time]() { simgrid::s4u::this_actor::sleep_for(time); })) { rv = MSG_HOST_FAILURE; } if (rv != MSG_OK) { @@ -241,7 +240,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_sleep(JNIEnv *env, jclass cl JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_waitFor(JNIEnv * env, jobject jprocess, jdouble jseconds) { msg_error_t rv = MSG_OK; - if (not simgrid::kernel::context::StopRequest::try_n_catch( + if (not simgrid::ForcefulKillException::try_n_catch( [&jseconds]() { simgrid::s4u::this_actor::sleep_for((double)jseconds); })) { rv = MSG_HOST_FAILURE; jxbt_throw_by_name(env, "org/simgrid/msg/ProcessKilledError", "Process killed"); @@ -262,7 +261,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_kill(JNIEnv * env, jobject j jxbt_throw_notbound(env, "process", jprocess); return; } - if (not simgrid::kernel::context::StopRequest::try_n_catch([&process]() { MSG_process_kill(process); })) { + if (not simgrid::ForcefulKillException::try_n_catch([&process]() { MSG_process_kill(process); })) { jxbt_throw_by_name(env, "org/simgrid/msg/ProcessKilledError", "Process killed"); } } diff --git a/src/bindings/java/jmsg_task.cpp b/src/bindings/java/jmsg_task.cpp index 77edf00cb8..1983b13579 100644 --- a/src/bindings/java/jmsg_task.cpp +++ b/src/bindings/java/jmsg_task.cpp @@ -5,6 +5,7 @@ /* 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 "simgrid/Exception.hpp" #include "simgrid/s4u/Host.hpp" #include "src/kernel/context/Context.hpp" @@ -127,7 +128,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_execute(JNIEnv * env, jobject j return; } msg_error_t rv; - if (not simgrid::kernel::context::StopRequest::try_n_catch([&rv, &task]() { rv = MSG_task_execute(task); })) { + if (not simgrid::ForcefulKillException::try_n_catch([&rv, &task]() { rv = MSG_task_execute(task); })) { jxbt_throw_by_name(env, "org/simgrid/msg/ProcessKilledError", "Process killed"); } @@ -286,7 +287,7 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_receive(JNIEnv* env, jclass const char *alias = env->GetStringUTFChars(jalias, 0); msg_error_t rv; - if (not simgrid::kernel::context::StopRequest::try_n_catch([&rv, &task, &alias, &jtimeout]() { + if (not simgrid::ForcefulKillException::try_n_catch([&rv, &task, &alias, &jtimeout]() { rv = MSG_task_receive_ext(&task, alias, (double)jtimeout, /*host*/ nullptr); })) { jxbt_throw_by_name(env, "org/simgrid/msg/ProcessKilledError", "Process killed"); diff --git a/src/bindings/java/jmsg_vm.cpp b/src/bindings/java/jmsg_vm.cpp index 18afc0a742..b917e08303 100644 --- a/src/bindings/java/jmsg_vm.cpp +++ b/src/bindings/java/jmsg_vm.cpp @@ -151,7 +151,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_nativeMigration(JNIEnv* env, jobj { msg_vm_t vm = jvm_get_native(env,jvm); msg_host_t host = jhost_get_native(env, jhost); - if (not simgrid::kernel::context::StopRequest::try_n_catch([&vm, &host]() { MSG_vm_migrate(vm, host); })) { + if (not simgrid::ForcefulKillException::try_n_catch([&vm, &host]() { MSG_vm_migrate(vm, host); })) { XBT_VERB("Caught exception during migration"); jxbt_throw_host_failure(env, "during migration"); } diff --git a/src/bindings/python/simgrid_python.cpp b/src/bindings/python/simgrid_python.cpp index eb7456308c..ca675388b0 100644 --- a/src/bindings/python/simgrid_python.cpp +++ b/src/bindings/python/simgrid_python.cpp @@ -13,6 +13,7 @@ #include #include "src/kernel/context/Context.hpp" +#include #include #include #include @@ -56,7 +57,7 @@ PYBIND11_MODULE(simgrid, m) m.attr("simgrid_version") = simgrid_version; // Internal exception used to kill actors and sweep the RAII chimney (free objects living on the stack) - py::object pyStopRequestEx = py::register_exception(m, "ActorKilled"); + py::object pyForcefulKillEx = py::register_exception(m, "ActorKilled"); /* this_actor namespace */ void (*sleep_for_fun)(double) = &simgrid::s4u::this_actor::sleep_for; // pick the right overload @@ -83,15 +84,13 @@ PYBIND11_MODULE(simgrid, m) m2.def("on_exit", [](py::object fun) { ActorPtr act = Actor::self(); - simgrid::s4u::this_actor::on_exit( - [act, fun](int /*ignored*/, void* /*data*/) { - try { - fun(); - } catch (py::error_already_set& e) { - xbt_die("Error while executing the on_exit lambda: %s", e.what()); - } - }, - nullptr); + simgrid::s4u::this_actor::on_exit([act, fun](bool /*failed*/) { + try { + fun(); + } catch (py::error_already_set& e) { + xbt_die("Error while executing the on_exit lambda: %s", e.what()); + } + }); }, ""); @@ -116,10 +115,10 @@ PYBIND11_MODULE(simgrid, m) ":cpp:func:`simgrid::s4u::Engine::load_deployment()`") .def("run", &Engine::run, "Run the simulation") .def("register_actor", - [pyStopRequestEx](Engine*, const std::string& name, py::object fun_or_class) { + [pyForcefulKillEx](Engine*, const std::string& name, py::object fun_or_class) { simgrid::simix::register_function( - name, [pyStopRequestEx, fun_or_class](std::vector args) -> simgrid::simix::ActorCode { - return [pyStopRequestEx, fun_or_class, args]() { + name, [pyForcefulKillEx, fun_or_class](std::vector args) -> simgrid::simix::ActorCode { + return [pyForcefulKillEx, fun_or_class, args]() { try { /* Convert the std::vector into a py::tuple */ py::tuple params(args.size() - 1); @@ -132,9 +131,9 @@ PYBIND11_MODULE(simgrid, m) if (py::isinstance(res)) res(); } catch (py::error_already_set& ex) { - if (ex.matches(pyStopRequestEx)) { + if (ex.matches(pyForcefulKillEx)) { XBT_VERB("Actor killed"); - /* Stop here that StopRequest exception which was meant to free the RAII stuff on the stack */ + /* Stop here that ForcefulKill exception which was meant to free the RAII stuff on the stack */ } else { throw; } @@ -176,16 +175,16 @@ PYBIND11_MODULE(simgrid, m) "application, see :ref:`class s4u::Actor `") .def("create", - [pyStopRequestEx](py::str name, py::object host, py::object fun, py::args args) { + [pyForcefulKillEx](py::str name, py::object host, py::object fun, py::args args) { - return simgrid::s4u::Actor::create(name, host.cast(), [fun, args, pyStopRequestEx]() { + return simgrid::s4u::Actor::create(name, host.cast(), [fun, args, pyForcefulKillEx]() { try { fun(*args); } catch (py::error_already_set& ex) { - if (ex.matches(pyStopRequestEx)) { + if (ex.matches(pyForcefulKillEx)) { XBT_VERB("Actor killed"); - /* Stop here that StopRequest exception which was meant to free the RAII stuff on the stack */ + /* Stop here that ForcefulKill exception which was meant to free the RAII stuff on the stack */ } else { throw; } diff --git a/src/instr/instr_platform.cpp b/src/instr/instr_platform.cpp index 74e444bd03..4bc1e2c8be 100644 --- a/src/instr/instr_platform.cpp +++ b/src/instr/instr_platform.cpp @@ -306,13 +306,11 @@ static void instr_actor_on_creation(simgrid::s4u::ActorPtr actor) root->type_->by_name_or_create("ACTOR_TASK_LINK", actor_type, actor_type); std::string container_name = instr_pid(actor.get()); - actor->on_exit( - [container_name](int status, void*) { - if (status == SMX_EXIT_FAILURE) - // kill means that this actor no longer exists, let's destroy it - simgrid::instr::Container::by_name(container_name)->remove_from_parent(); - }, - actor->get_impl()); + actor->on_exit([container_name](bool failed) { + if (failed) + // kill means that this actor no longer exists, let's destroy it + simgrid::instr::Container::by_name(container_name)->remove_from_parent(); + }); } static long long int counter = 0; diff --git a/src/kernel/context/Context.cpp b/src/kernel/context/Context.cpp index 0471a5cd56..dedbf2c147 100644 --- a/src/kernel/context/Context.cpp +++ b/src/kernel/context/Context.cpp @@ -112,25 +112,6 @@ void Context::stop() AttachContext::~AttachContext() = default; -StopRequest::~StopRequest() = default; - -void StopRequest::do_throw() -{ - throw StopRequest(); -} - -bool StopRequest::try_n_catch(std::function try_block) -{ - bool res; - try { - try_block(); - res = true; - } catch (StopRequest const&) { - XBT_DEBUG("Caught a StopRequest"); - res = false; - } - return res; -} }}} /** @brief Executes all the processes to run (in parallel if possible). */ diff --git a/src/kernel/context/Context.hpp b/src/kernel/context/Context.hpp index 7bacdcf73e..97b99e22ac 100644 --- a/src/kernel/context/Context.hpp +++ b/src/kernel/context/Context.hpp @@ -86,41 +86,6 @@ public: virtual void attach_stop() = 0; }; -class XBT_PUBLIC StopRequest { - /** @brief Exception launched to kill an actor; do not block it! - * - * This exception is thrown whenever the actor's host is turned off. The actor stack is properly unwinded to release - * all objects allocated on the stack (RAII powa). - * - * You may want to catch this exception to perform some extra cleanups in your simulation, but YOUR ACTORS MUST NEVER - * SURVIVE a StopRequest, or your simulation will segfault. - * - * @verbatim - * void* payload = malloc(512); - * - * try { - * simgrid::s4u::this_actor::execute(100000); - * } catch (simgrid::kernel::context::StopRequest& e) { // oops, my host just turned off - * free(malloc); - * throw; // I shall never survive on an host that was switched off - * } - * @endverbatim - * - * Nope, Sonar, this should not inherit of std::exception nor of simgrid::Exception. - * Otherwise, users may accidentally catch it with a try {} catch (std::exception) - */ -public: - StopRequest() = default; - explicit StopRequest(const std::string& msg) : msg_(std::string("Actor killed (") + msg + std::string(").")) {} - ~StopRequest(); - const char* what() const noexcept { return msg_.c_str(); } - - static void do_throw(); - static bool try_n_catch(std::function try_block); - -private: - std::string msg_ = std::string("Actor killed."); -}; /* This allows Java to hijack the context factory (Java induces factories of factory :) */ typedef ContextFactory* (*ContextFactoryInitializer)(); diff --git a/src/kernel/context/ContextBoost.cpp b/src/kernel/context/ContextBoost.cpp index b1deb29184..4298641e5c 100644 --- a/src/kernel/context/ContextBoost.cpp +++ b/src/kernel/context/ContextBoost.cpp @@ -69,8 +69,8 @@ void BoostContext::wrapper(BoostContext::arg_type arg) try { (*context)(); context->Context::stop(); - } catch (StopRequest const&) { - XBT_DEBUG("Caught a StopRequest"); + } catch (ForcefulKillException const&) { + XBT_DEBUG("Caught a ForcefulKillException"); } catch (simgrid::Exception const& e) { XBT_INFO("Actor killed by an uncatched exception %s", simgrid::xbt::demangle(typeid(e).name()).get()); throw; diff --git a/src/kernel/context/ContextRaw.cpp b/src/kernel/context/ContextRaw.cpp index e651a46565..2f0165fc4c 100644 --- a/src/kernel/context/ContextRaw.cpp +++ b/src/kernel/context/ContextRaw.cpp @@ -211,8 +211,8 @@ void RawContext::wrapper(void* arg) try { (*context)(); context->Context::stop(); - } catch (StopRequest const&) { - XBT_DEBUG("Caught a StopRequest"); + } catch (ForcefulKillException const&) { + XBT_DEBUG("Caught a ForcefulKillException"); } catch (simgrid::Exception const& e) { XBT_INFO("Actor killed by an uncatched exception %s", simgrid::xbt::demangle(typeid(e).name()).get()); throw; diff --git a/src/kernel/context/ContextSwapped.cpp b/src/kernel/context/ContextSwapped.cpp index 7a2de5b9bb..9f402179b9 100644 --- a/src/kernel/context/ContextSwapped.cpp +++ b/src/kernel/context/ContextSwapped.cpp @@ -3,6 +3,7 @@ /* 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 "simgrid/Exception.hpp" #include "simgrid/modelchecker.h" #include "src/internal_config.h" #include "src/kernel/context/context_private.hpp" @@ -147,7 +148,7 @@ void SwappedContext::stop() { Context::stop(); /* We must cut the actor execution using an exception to properly free the C++ RAII variables */ - throw StopRequest(); + throw ForcefulKillException(); } /** Maestro wants to run all ready actors */ diff --git a/src/kernel/context/ContextThread.cpp b/src/kernel/context/ContextThread.cpp index a164339ef0..f03413bb1a 100644 --- a/src/kernel/context/ContextThread.cpp +++ b/src/kernel/context/ContextThread.cpp @@ -103,9 +103,9 @@ void *ThreadContext::wrapper(void *param) context->Context::stop(); context->stop_hook(); } - } catch (StopRequest const&) { - XBT_DEBUG("Caught a StopRequest in Thread::wrapper"); - xbt_assert(not context->is_maestro(), "Maestro shall not receive StopRequests, even when detached."); + } catch (ForcefulKillException const&) { + XBT_DEBUG("Caught a ForcefulKillException in Thread::wrapper"); + xbt_assert(not context->is_maestro(), "Maestro shall not receive ForcefulKillExceptions, even when detached."); } catch (simgrid::Exception const& e) { XBT_INFO("Actor killed by an uncatched exception %s", simgrid::xbt::demangle(typeid(e).name()).get()); throw; @@ -148,7 +148,7 @@ void ThreadContext::stop() { Context::stop(); stop_hook(); - throw StopRequest(); + throw ForcefulKillException(); } void ThreadContext::suspend() diff --git a/src/kernel/context/ContextUnix.cpp b/src/kernel/context/ContextUnix.cpp index ad79b5e732..be6fbc9075 100644 --- a/src/kernel/context/ContextUnix.cpp +++ b/src/kernel/context/ContextUnix.cpp @@ -41,8 +41,8 @@ static void smx_ctx_wrapper(int i1, int i2) try { (*context)(); context->Context::stop(); - } catch (simgrid::kernel::context::StopRequest const&) { - XBT_DEBUG("Caught a StopRequest"); + } catch (simgrid::ForcefulKillException const&) { + XBT_DEBUG("Caught a ForcefulKillException"); } catch (simgrid::Exception const& e) { XBT_INFO("Actor killed by an uncatched exception %s", simgrid::xbt::demangle(typeid(e).name()).get()); throw; diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp index 7a261de633..d95e2db3c4 100644 --- a/src/msg/msg_process.cpp +++ b/src/msg/msg_process.cpp @@ -194,8 +194,10 @@ smx_context_t MSG_process_get_smx_ctx(msg_process_t process) { // deprecated -- * The on_exit functions are the functions executed when your process is killed. * You should use them to free the data used by your process. */ -void MSG_process_on_exit(int_f_pvoid_pvoid_t fun, void *data) { - simgrid::s4u::this_actor::on_exit([fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data); +void MSG_process_on_exit(int_f_int_pvoid_t fun, void* data) +{ + simgrid::s4u::this_actor::on_exit( + [fun, data](bool failed) { fun(failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS, data); }); } /** @brief Take an extra reference on that process to prevent it to be garbage-collected */ diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index a6a4495bfa..b20d8c6d37 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -85,14 +85,17 @@ void Actor::set_auto_restart(bool autorestart) }); } -void Actor::on_exit(int_f_pvoid_pvoid_t fun, void* data) /* deprecated */ +void Actor::on_exit(int_f_pvoid_pvoid_t fun, + void* data) /* deprecated: cleanup SIMIX_process_on_exit: change prototype of second parameter and + remove the last one */ { simgrid::simix::simcall([this, fun, data] { SIMIX_process_on_exit(pimpl_, fun, data); }); } -void Actor::on_exit(std::function fun, void* data) +void Actor::on_exit(std::function const fun) { - simgrid::simix::simcall([this, fun, data] { SIMIX_process_on_exit(pimpl_, fun, data); }); + simgrid::simix::simcall( + [this, fun] { SIMIX_process_on_exit(pimpl_, [fun](int a, void* /*data*/) { fun(a != 0); }, nullptr); }); } void Actor::migrate(Host* new_host) @@ -402,9 +405,14 @@ void exit() simgrid::simix::simcall([actor] { actor->exit(); }); } -void on_exit(std::function fun, void* data) +void on_exit(std::function const fun) +{ + SIMIX_process_self()->iface()->on_exit(fun); +} + +void on_exit(std::function const fun, void* data) /* deprecated */ { - SIMIX_process_self()->iface()->on_exit(fun, data); + SIMIX_process_self()->iface()->on_exit([fun, data](bool exit) { fun(exit, data); }); } /** @brief Moves the current actor to another host @@ -442,11 +450,11 @@ Host* getHost() /* deprecated */ } void on_exit(int_f_pvoid_pvoid_t fun, void* data) /* deprecated */ { - SIMIX_process_self()->iface()->on_exit([fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data); + SIMIX_process_self()->iface()->on_exit([fun, data](int a) { fun((void*)(intptr_t)a, data); }); } void onExit(int_f_pvoid_pvoid_t fun, void* data) /* deprecated */ { - on_exit([fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data); + on_exit([fun, data](int a) { fun((void*)(intptr_t)a, data); }); } void kill() /* deprecated */ { diff --git a/src/simgrid/Exception.cpp b/src/simgrid/Exception.cpp new file mode 100644 index 0000000000..cd4fc1fa22 --- /dev/null +++ b/src/simgrid/Exception.cpp @@ -0,0 +1,31 @@ +/* Copyright (c) 2018-2019. 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 + +XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context); + +namespace simgrid { + +ForcefulKillException::~ForcefulKillException() = default; + +void ForcefulKillException::do_throw() +{ + throw ForcefulKillException(); +} + +bool ForcefulKillException::try_n_catch(std::function try_block) +{ + bool res; + try { + try_block(); + res = true; + } catch (ForcefulKillException const&) { + XBT_DEBUG("Caught a ForcefulKillException"); + res = false; + } + return res; +} +} // namespace simgrid diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index 1b92ac6b8e..2a664f42e5 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -164,7 +164,7 @@ void ActorImpl::exit() // Forcefully kill the actor if its host is turned off. Not a HostFailureException because you should not survive that if (not host_->is_on()) - this->throw_exception(std::make_exception_ptr(simgrid::kernel::context::StopRequest("host failed"))); + this->throw_exception(std::make_exception_ptr(ForcefulKillException("host failed"))); /* destroy the blocking synchro if any */ if (waiting_synchro != nullptr) { @@ -273,7 +273,7 @@ void ActorImpl::yield() if (context_->iwannadie) { XBT_DEBUG("Actor %s@%s is dead", get_cname(), host_->get_cname()); - // throw simgrid::kernel::context::StopRequest(); Does not seem to properly kill the actor + // throw simgrid::kernel::context::ForcefulKillException(); Does not seem to properly kill the actor context_->stop(); THROW_IMPOSSIBLE; } @@ -689,7 +689,7 @@ void SIMIX_process_on_exit(smx_actor_t actor, int_f_pvoid_pvoid_t fun, void* dat SIMIX_process_on_exit(actor, [fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data); } -void SIMIX_process_on_exit(smx_actor_t actor, std::function fun, void* data) +void SIMIX_process_on_exit(smx_actor_t actor, std::function fun, void* data) { xbt_assert(actor, "current process not found: are you in maestro context ?"); diff --git a/src/simix/ActorImpl.hpp b/src/simix/ActorImpl.hpp index 14af36a060..a0c178d4d0 100644 --- a/src/simix/ActorImpl.hpp +++ b/src/simix/ActorImpl.hpp @@ -15,7 +15,7 @@ #include struct s_smx_process_exit_fun_t { - std::function fun; + std::function fun; void *arg; }; diff --git a/src/xbt/exception.cpp b/src/xbt/exception.cpp index eb4878a134..41db24db88 100644 --- a/src/xbt/exception.cpp +++ b/src/xbt/exception.cpp @@ -145,8 +145,9 @@ static void handler() std::abort(); } - catch (simgrid::kernel::context::StopRequest& e) { - XBT_ERROR("Received a StopRequest at the top-level exception handler. Maybe a Java->C++ call that is not protected " + catch (simgrid::ForcefulKillException const& e) { + XBT_ERROR("Received a ForcefulKillException at the top-level exception handler. Maybe a Java->C++ call that is not " + "protected " "in a try/catch?"); show_backtrace(bt); } diff --git a/teshsuite/msg/process-lifetime/process-lifetime.c b/teshsuite/msg/process-lifetime/process-lifetime.c index 8e6f518618..602e1af7f2 100644 --- a/teshsuite/msg/process-lifetime/process-lifetime.c +++ b/teshsuite/msg/process-lifetime/process-lifetime.c @@ -10,7 +10,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example"); /* Executed on process termination*/ -static int my_onexit(XBT_ATTRIB_UNUSED void* ignored1, XBT_ATTRIB_UNUSED void* ignored2) +static int my_onexit(XBT_ATTRIB_UNUSED int ignored1, XBT_ATTRIB_UNUSED void* ignored2) { XBT_INFO("Exiting now (done sleeping or got killed)."); /* - Just display an informative message (see tesh file) */ return 0; diff --git a/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp b/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp index e29d62a150..45e5492a68 100644 --- a/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp +++ b/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp @@ -12,17 +12,15 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example") std::vector all_hosts; /* Helper function easing the testing of actor's ending condition */ -static void assert_exit(int status, double duration) +static void assert_exit(bool exp_failed, double duration) { double expected_time = simgrid::s4u::Engine::get_clock() + duration; - simgrid::s4u::this_actor::on_exit( - [status, expected_time](int got_status, void* /*ignored*/) { - xbt_assert(status == got_status, "Exit status mismatch. Expected %d, got %d", status, got_status); - xbt_assert(std::fabs(expected_time - simgrid::s4u::Engine::get_clock()) < 0.001, - "Exit time mismatch. Expected %f", expected_time); - XBT_VERB("Checks on exit successful"); - }, - nullptr); + simgrid::s4u::this_actor::on_exit([exp_failed, expected_time](bool got_failed) { + xbt_assert(exp_failed == got_failed, "Exit failure status mismatch. Expected %d, got %d", exp_failed, got_failed); + xbt_assert(std::fabs(expected_time - simgrid::s4u::Engine::get_clock()) < 0.001, "Exit time mismatch. Expected %f", + expected_time); + XBT_VERB("Checks on exit successful"); + }); } /* Helper function in charge of running a test and doing some sanity checks afterward */ static void run_test(const char* test_name, std::function test) @@ -57,7 +55,7 @@ static void test_sleep() bool global = false; simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5", all_hosts[1], [&global]() { - assert_exit(0, 5.); + assert_exit(false, 5.); simgrid::s4u::this_actor::sleep_for(5); global = true; }); @@ -70,7 +68,7 @@ static void test_sleep_kill_middle() XBT_INFO("%s: Launch a sleep(5), and kill it after 2 secs", __func__); simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5_killed", all_hosts[1], []() { - assert_exit(1, 2); + assert_exit(true, 2); simgrid::s4u::this_actor::sleep_for(5); xbt_die("I should be dead now"); }); @@ -84,7 +82,7 @@ static void test_sleep_kill_begin() XBT_INFO("%s: Launch a sleep(5), and kill it right after start", __func__); simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5_killed", all_hosts[1], []() { - assert_exit(1, 0); + assert_exit(true, 0); simgrid::s4u::this_actor::sleep_for(5); xbt_die("I should be dead now"); }); @@ -98,7 +96,7 @@ static void test_sleep_restart_begin() XBT_INFO("%s: Launch a sleep(5), and restart its host right after start", __func__); simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5_restarted", all_hosts[1], []() { - assert_exit(1, 0); + assert_exit(true, 0); simgrid::s4u::this_actor::sleep_for(5); xbt_die("I should be dead now"); }); @@ -114,7 +112,7 @@ static void test_sleep_restart_middle() XBT_INFO("%s: Launch a sleep(5), and restart its host after 2 secs", __func__); simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5_restarted", all_hosts[1], []() { - assert_exit(1, 2); + assert_exit(true, 2); simgrid::s4u::this_actor::sleep_for(5); xbt_die("I should be dead now"); }); @@ -130,19 +128,14 @@ static void test_sleep_restart_end() bool sleeper_done = false; simgrid::s4u::Actor::create("sleep5_restarted", all_hosts[1], [&sleeper_done]() { - assert_exit(0, 5); + assert_exit(true, 5); simgrid::s4u::this_actor::sleep_for(5); + all_hosts[1]->turn_off(); // kill the host right at the end of this sleep and of this actor sleeper_done = true; }); - simgrid::s4u::Actor::create("killer", all_hosts[0], []() { - simgrid::s4u::this_actor::sleep_for(5); - XBT_INFO("Killer!"); - all_hosts[1]->turn_off(); - all_hosts[1]->turn_on(); - }); simgrid::s4u::this_actor::sleep_for(10); - xbt_assert(sleeper_done, - "Restarted actor was already dead in the scheduling round during which the host_off simcall was issued"); + all_hosts[1]->turn_on(); + xbt_assert(sleeper_done, "Not sure of how the actor survived the shutdown of its host."); } static void test_exec() { @@ -150,7 +143,7 @@ static void test_exec() bool global = false; simgrid::s4u::ActorPtr exec5 = simgrid::s4u::Actor::create("exec5", all_hosts[1], [&global]() { - assert_exit(0, 5.); + assert_exit(false, 5.); simgrid::s4u::this_actor::execute(500000000); global = true; }); @@ -163,7 +156,7 @@ static void test_exec_kill_middle() XBT_INFO("%s: Launch a execute(5s), and kill it after 2 secs", __func__); simgrid::s4u::ActorPtr exec5 = simgrid::s4u::Actor::create("exec5_killed", all_hosts[1], []() { - assert_exit(1, 2); + assert_exit(true, 2); simgrid::s4u::this_actor::execute(500000000); xbt_die("I should be dead now"); }); @@ -177,7 +170,7 @@ static void test_exec_kill_begin() XBT_INFO("%s: Launch a execute(5s), and kill it right after start", __func__); simgrid::s4u::ActorPtr exec5 = simgrid::s4u::Actor::create("exec5_killed", all_hosts[1], []() { - assert_exit(1, 0); + assert_exit(true, 0); simgrid::s4u::this_actor::execute(500000000); xbt_die("I should be dead now"); }); @@ -207,7 +200,7 @@ static void test_exec_restart_middle() XBT_INFO("%s: Launch a execute(5s), and restart its host after 2 secs", __func__); simgrid::s4u::ActorPtr exec5 = simgrid::s4u::Actor::create("exec5_restarted", all_hosts[1], []() { - assert_exit(1, 2); + assert_exit(true, 2); simgrid::s4u::this_actor::execute(500000000); xbt_die("I should be dead now"); }); @@ -223,7 +216,7 @@ static void test_exec_restart_end() bool execution_done = false; simgrid::s4u::Actor::create("exec5_restarted", all_hosts[1], [&execution_done]() { - assert_exit(0, 5); + assert_exit(false, 5); simgrid::s4u::this_actor::execute(500000000); execution_done = true; }); @@ -245,13 +238,13 @@ static void test_comm() bool recv_done = false; simgrid::s4u::Actor::create("sender", all_hosts[1], [&send_done]() { - assert_exit(0, 5); + assert_exit(false, 5); char* payload = xbt_strdup("toto"); simgrid::s4u::Mailbox::by_name("mb")->put(payload, 5000); send_done = true; }); simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() { - assert_exit(0, 5); + assert_exit(false, 5); void* payload = simgrid::s4u::Mailbox::by_name("mb")->get(); xbt_free(payload); recv_done = true; @@ -269,7 +262,7 @@ static void test_comm_dsend_and_quit() bool recv_done = false; simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[1], [&dsend_done]() { - assert_exit(0, 0); + assert_exit(false, 0); char* payload = xbt_strdup("toto"); simgrid::s4u::Mailbox::by_name("mb")->put_init(payload, 1000)->detach(); dsend_done = true; @@ -277,7 +270,7 @@ static void test_comm_dsend_and_quit() }); simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() { - assert_exit(0, 3); + assert_exit(false, 3); bool got_exception = false; simgrid::s4u::this_actor::sleep_for(2); try { @@ -304,7 +297,7 @@ static void test_comm_killsend() bool recv_done = false; simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[1], [&send_done]() { - assert_exit(1, 2); + assert_exit(true, 2); // Encapsulate the payload in a std::unique_ptr so that it is correctly free'd when the sender is killed during its // communication (thanks to RAII). The pointer is then released when the communication is over. std::unique_ptr payload(xbt_strdup("toto"), &xbt_free_f); @@ -313,7 +306,7 @@ static void test_comm_killsend() send_done = true; }); simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() { - assert_exit(0, 2); + assert_exit(false, 2); bool got_exception = false; try { void* payload = simgrid::s4u::Mailbox::by_name("mb")->get(); @@ -344,7 +337,7 @@ static void main_dispatcher() * to avoid that they exit before their victim dereferences their name */ run_test("sleep restarted at start", test_sleep_restart_begin); run_test("sleep restarted at middle", test_sleep_restart_middle); - run_test("sleep restarted at end", test_sleep_restart_end); + // run_test("sleep restarted at end", test_sleep_restart_end); run_test("exec", static_cast>(test_exec)); run_test("exec killed at start", test_exec_kill_begin); diff --git a/teshsuite/s4u/pid/pid.cpp b/teshsuite/s4u/pid/pid.cpp index 4891a38a6a..7fd0ac61a9 100644 --- a/teshsuite/s4u/pid/pid.cpp +++ b/teshsuite/s4u/pid/pid.cpp @@ -12,7 +12,7 @@ static void sendpid() simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name("mailbox"); int pid = simgrid::s4u::this_actor::get_pid(); double comm_size = 100000; - simgrid::s4u::this_actor::on_exit([pid](int, void*) { XBT_INFO("Process \"%d\" killed.", pid); }, nullptr); + simgrid::s4u::this_actor::on_exit([pid](bool /*failed*/) { XBT_INFO("Process \"%d\" killed.", pid); }); XBT_INFO("Sending pid of \"%d\".", pid); mailbox->put(&pid, comm_size); diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 194cb9d435..d629a2482d 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -444,6 +444,7 @@ set(S4U_SRC ) set(SIMGRID_SRC + src/simgrid/Exception.cpp src/simgrid/sg_config.cpp src/simgrid/util.hpp )