From c189a4d09de372fdd7e607bcb8de17cca8a921ee Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Fri, 19 Apr 2019 13:38:01 +0200 Subject: [PATCH] Add a test for callback disconnection --- teshsuite/xbt/CMakeLists.txt | 4 ++- teshsuite/xbt/signals/signals.cpp | 51 ++++++++++++++++++++++++++++++ teshsuite/xbt/signals/signals.tesh | 14 ++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 teshsuite/xbt/signals/signals.cpp create mode 100644 teshsuite/xbt/signals/signals.tesh diff --git a/teshsuite/xbt/CMakeLists.txt b/teshsuite/xbt/CMakeLists.txt index c966d5423d..1d9a841427 100644 --- a/teshsuite/xbt/CMakeLists.txt +++ b/teshsuite/xbt/CMakeLists.txt @@ -8,7 +8,7 @@ foreach(x cmdline log_large log_usage) set(teshsuite_src ${teshsuite_src} ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.c) endforeach() -foreach(x parallel_log_crashtest parmap_bench parmap_test) +foreach(x parallel_log_crashtest parmap_bench parmap_test signals) add_executable (${x} EXCLUDE_FROM_ALL ${x}/${x}.cpp) target_link_libraries(${x} simgrid) set_target_properties(${x} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x}) @@ -39,6 +39,8 @@ if(enable_coverage) ADD_TESH(tesh-xbt-parmap_bench --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/xbt/parmap_bench --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/parmap_bench parmap_bench.tesh) endif() +ADD_TESH(tesh-xbt-signals --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/xbt/signals --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/signals signals.tesh) + if(enable_debug) ADD_TESH(tesh-xbt-log --cd ${CMAKE_BINARY_DIR}/teshsuite/xbt/log_usage ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/log_usage/log_usage.tesh) else() diff --git a/teshsuite/xbt/signals/signals.cpp b/teshsuite/xbt/signals/signals.cpp new file mode 100644 index 0000000000..466852792e --- /dev/null +++ b/teshsuite/xbt/signals/signals.cpp @@ -0,0 +1,51 @@ +/* Copyright (c) 2010-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 "simgrid/s4u.hpp" + +XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example"); + +static void worker() +{ + simgrid::s4u::Host* other_host = simgrid::s4u::Host::by_name("Fafard"); + unsigned int first = + simgrid::s4u::Host::on_state_change.connect([](simgrid::s4u::Host const&) { XBT_INFO("First callback"); }); + unsigned int second = + simgrid::s4u::Host::on_state_change.connect([](simgrid::s4u::Host const&) { XBT_INFO("Second callback"); }); + unsigned int third = + simgrid::s4u::Host::on_state_change.connect([](simgrid::s4u::Host const&) { XBT_INFO("Third callback"); }); + + XBT_INFO("Turning off: Three callbacks should be triggered"); + other_host->turn_off(); + + XBT_INFO("Disconnect the second callback"); + simgrid::s4u::Host::on_state_change.disconnect(second); + + XBT_INFO("Turning on: Two callbacks should be triggered"); + other_host->turn_on(); + + XBT_INFO("Disconnect the first callback"); + simgrid::s4u::Host::on_state_change.disconnect(first); + + XBT_INFO("Turning off: One callback should be triggered"); + other_host->turn_off(); + + XBT_INFO("Disconnect the third callback"); + simgrid::s4u::Host::on_state_change.disconnect(third); + XBT_INFO("Turning on: No more callbacks"); + other_host->turn_on(); +} + +int main(int argc, char* argv[]) +{ + simgrid::s4u::Engine e(&argc, argv); + e.load_platform(argv[1]); + + simgrid::s4u::Actor::create("worker", simgrid::s4u::Host::by_name("Tremblay"), worker); + + e.run(); + + return 0; +} diff --git a/teshsuite/xbt/signals/signals.tesh b/teshsuite/xbt/signals/signals.tesh new file mode 100644 index 0000000000..da40f9070a --- /dev/null +++ b/teshsuite/xbt/signals/signals.tesh @@ -0,0 +1,14 @@ +$ ./signals ${platfdir}/small_platform.xml +> [Tremblay:worker:(1) 0.000000] [s4u_test/INFO] Turning off: Three callbacks should be triggered +> [0.000000] [s4u_test/INFO] First callback +> [0.000000] [s4u_test/INFO] Second callback +> [0.000000] [s4u_test/INFO] Third callback +> [Tremblay:worker:(1) 0.000000] [s4u_test/INFO] Disconnect the second callback +> [Tremblay:worker:(1) 0.000000] [s4u_test/INFO] Turning on: Two callbacks should be triggered +> [0.000000] [s4u_test/INFO] First callback +> [0.000000] [s4u_test/INFO] Third callback +> [Tremblay:worker:(1) 0.000000] [s4u_test/INFO] Disconnect the first callback +> [Tremblay:worker:(1) 0.000000] [s4u_test/INFO] Turning off: One callback should be triggered +> [0.000000] [s4u_test/INFO] Third callback +> [Tremblay:worker:(1) 0.000000] [s4u_test/INFO] Disconnect the third callback +> [Tremblay:worker:(1) 0.000000] [s4u_test/INFO] Turning on: No more callbacks -- 2.20.1