Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' into depencencies
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Sun, 26 Jan 2020 14:25:56 +0000 (15:25 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Sun, 26 Jan 2020 14:25:56 +0000 (15:25 +0100)
17 files changed:
.appveyor.yml
.travis.yml
CMakeLists.txt
ChangeLog
MANIFEST.in
examples/python/CMakeLists.txt
examples/python/async-wait/async-wait.py
setup.py
src/bindings/python/simgrid_python.cpp
teshsuite/python/CMakeLists.txt [new file with mode: 0644]
teshsuite/python/borken-context/borken-context.py [new file with mode: 0644]
teshsuite/python/borken-context/borken-context.tesh [new file with mode: 0644]
teshsuite/python/borken-context/borken-context_d.xml [new file with mode: 0644]
teshsuite/python/corrupt-stack/corrupt-stack.py [new file with mode: 0644]
teshsuite/python/corrupt-stack/corrupt-stack.tesh [new file with mode: 0644]
teshsuite/python/corrupt-stack/corrupt-stack_d.xml [new file with mode: 0644]
tools/cmake/DefinePackages.cmake

index 3203180..2411347 100644 (file)
@@ -40,15 +40,13 @@ install:
 # Work around a bug on appveyor where the default sh is not the one I expect
 - rename "C:\Program Files\Git\usr\bin\sh.exe" "sh-ignored.exe"
 # We need pybind11. SimGrid will pick it automatically if the subdir is here
-#- cmd: git clone --depth=1 https://github.com/pybind/pybind11.git
+- cmd: git clone --depth=1 https://github.com/pybind/pybind11.git
 
 build_script:
 - cmake -G "MinGW Makefiles" -Denable_lua=OFF -Denable_documentation=OFF -Denable_java=ON -Denable_smpi=OFF -Denable_mallocators=OFF -Denable_lto=OFF .
-- mingw32-make.exe VERBOSE=1 java-all python-bindings # Only the Java and Python parts
+- 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 ForcefulKill exception, that seems badly caught somehow.
-# - ctest --output-on-failure -R python
+- ctest --output-on-failure -R python
 
 artifacts:
 - path: simgrid.jar
index 480a3b0..15a91d2 100644 (file)
@@ -47,21 +47,24 @@ jobs:
     - os: windows
       script:
       - mv "C:/Program Files/Git/usr/bin/sh.exe" "sh-ignored.exe"
-      -  df -h
-      -  du -hs /tmp || true
-      -  choco install boost-msvc-12 python jdk8
-      -  export CC=gcc
-      -  export CXX=g++
-      -  export PATH='C:\Python38':'C:\local\boost_1_58_0':$PATH
-      -  export BOOST_LIBRARYDIR='C:/local/boost_1_58_0/lib64-msvc-12.0'
-      -  export BOOST_INCLUDEDIR='C:/local/boost_1_58_0/include'
-      -  export JAVA_HOME='C:/Program Files/Java/jdk1.8.0_211'
-      -  cmake -G "MinGW Makefiles" -Denable_lua=OFF -Denable_documentation=OFF -Denable_java=ON -Denable_smpi=OFF -Denable_mallocators=OFF -Denable_lto=OFF .
-      -  df -h
-      -  du -hs /tmp || true
-      -  mingw32-make.exe VERBOSE=1 java-all && ctest --output-on-failure -R java
-      -  df -h
-      -  du -hc /tmp || true
+      - df -h
+      - du -hs /tmp || true
+      - choco install boost-msvc-12 python jdk8
+      - export CC=gcc
+      - export CXX=g++
+      - export PATH='C:\Python38':'C:\local\boost_1_58_0':$PATH
+      - export BOOST_LIBRARYDIR='C:/local/boost_1_58_0/lib64-msvc-12.0'
+      - export BOOST_INCLUDEDIR='C:/local/boost_1_58_0/include'
+      - export JAVA_HOME='C:/Program Files/Java/jdk1.8.0_211'
+      # We need pybind11. SimGrid will pick it automatically if the subdir is here
+      # - git clone --depth=1 https://github.com/pybind/pybind11.git
+      - cmake -G "MinGW Makefiles" -Denable_lua=OFF -Denable_documentation=OFF -Denable_java=ON -Denable_smpi=OFF -Denable_mallocators=OFF -Denable_lto=OFF .
+      - df -h
+      - du -hs /tmp || true
+      - mingw32-make.exe VERBOSE=1 java-all && ctest --output-on-failure -R java
+      # - mingw32-make.exe VERBOSE=1 python-bindings && ctest --output-on-failure -R python
+      - df -h
+      - du -hc /tmp || true
     - os: osx
       osx_image: xcode11
       script:
index 5b0f0da..26f1be5 100644 (file)
@@ -802,8 +802,9 @@ if((NOT DEFINED enable_python) OR enable_python)
 
     else()
       find_package(pybind11 CONFIG)
-      if (pybind11_VERSION VERSION_LESS 2.2)
-        message(STATUS "SimGrid needs at least v2.2 of pybind11. Disabling the Python bindings (found version: ${pybind11_VERSION}).")
+      message(STATUS "Pybind11 version: ${pybind11_VERSION}")
+      if (pybind11_VERSION VERSION_LESS 2.4)
+        message(STATUS "SimGrid needs at least v2.4 of pybind11. Disabling the Python bindings.")
         set(pybind11_FOUND OFF)
       endif()
     endif()
index feceb39..6490385 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,11 @@ General:
 - Drop support for Viva/Triva (old visualization tools), hence removed
   TRACE_get_node_types() and TRACE_get_edge_types() functions.
 
+Python:
+- Require pybind11 version 2.4.
+- Greatly improve locking during context switches with Python. No more tests are
+  failing currently, even on win32.
+
 S4U:
 - Actor: Merge signals on_migration_start/end into on_host_change
 - Actor: Rename migrate() into set_host()
@@ -52,6 +57,7 @@ SMPI:
   call, which should be called if SMPI is not being used through smpirun.
 
 Fixed bugs (FG#.. -> framagit bugs; FG!.. -> framagit merge requests):
+ - FG#9: Python bindings crashing
  - FG#39: Missing s4u::Comm::wait_any_for example
  - FG#42: Add support for ThreadSanitizer (TSan)
  - FG!19: Removing RngStream
index aadfaed..b088a00 100644 (file)
@@ -253,6 +253,8 @@ include examples/python/actor-join/actor-join.py
 include examples/python/actor-join/actor-join.tesh
 include examples/python/actor-kill/actor-kill.py
 include examples/python/actor-kill/actor-kill.tesh
+include examples/python/actor-lifetime/actor-lifetime.py
+include examples/python/actor-lifetime/actor-lifetime.tesh
 include examples/python/actor-migrate/actor-migrate.py
 include examples/python/actor-migrate/actor-migrate.tesh
 include examples/python/actor-suspend/actor-suspend.py
@@ -690,6 +692,12 @@ include teshsuite/msg/trace_integration/test-hbp1.5-hbp1.5.xml
 include teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml
 include teshsuite/msg/trace_integration/trace_integration.c
 include teshsuite/msg/trace_integration/trace_integration.tesh
+include teshsuite/python/borken-context/borken-context.py
+include teshsuite/python/borken-context/borken-context.tesh
+include teshsuite/python/borken-context/borken-context_d.xml
+include teshsuite/python/corrupt-stack/corrupt-stack.py
+include teshsuite/python/corrupt-stack/corrupt-stack.tesh
+include teshsuite/python/corrupt-stack/corrupt-stack_d.xml
 include teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp
 include teshsuite/s4u/activity-lifecycle/activity-lifecycle.tesh
 include teshsuite/s4u/activity-lifecycle/testing_platform.xml
@@ -1934,8 +1942,6 @@ include examples/platforms/vivaldi.xml
 include examples/platforms/wifi.xml
 include examples/python/CMakeLists.txt
 include examples/python/actor-create/actor-create_d.xml
-include examples/python/actor-lifetime/actor-lifetime.py
-include examples/python/actor-lifetime/actor-lifetime.tesh
 include examples/python/actor-lifetime/actor-lifetime_d.xml
 include examples/python/async-wait/async-wait_d.xml
 include examples/python/async-waitall/async-waitall_d.xml
@@ -2655,6 +2661,7 @@ include teshsuite/lua/CMakeLists.txt
 include teshsuite/lua/lua_platforms.tesh
 include teshsuite/mc/CMakeLists.txt
 include teshsuite/msg/CMakeLists.txt
+include teshsuite/python/CMakeLists.txt
 include teshsuite/s4u/CMakeLists.txt
 include teshsuite/simdag/CMakeLists.txt
 include teshsuite/simix/CMakeLists.txt
index d2ef8a1..d393368 100644 (file)
@@ -1,24 +1,23 @@
-foreach(example actor-create actor-daemon actor-join actor-kill actor-migrate actor-suspend actor-yield actor-lifetime
+foreach(example actor-create actor-daemon actor-join actor-kill actor-migrate actor-suspend actor-yield actor-lifetime
                 async-wait async-waitall async-waitany
                 exec-async exec-basic exec-dvfs exec-remote)
   set(tesh_files    ${tesh_files}   ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}.tesh)
   set(examples_src  ${examples_src} ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}.py)
 
   if(enable_python)
-    ADD_TESH(python-${example} --setenv srcdir=${CMAKE_CURRENT_SOURCE_DIR}/${example}
+    ADD_TESH_FACTORIES(python-${example} "thread;ucontext;raw;boost"
+                               --setenv srcdir=${CMAKE_CURRENT_SOURCE_DIR}/${example}
                                --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms
                                --setenv pythoncmd=${PYTHON_EXECUTABLE}
                               --setenv LD_LIBRARY_PATH=${TESH_LIBRARY_PATH}
                               --setenv PYTHONPATH=${CMAKE_BINARY_DIR}/lib
                               --cd ${CMAKE_CURRENT_SOURCE_DIR}/${example}
-                               ${CMAKE_HOME_DIRECTORY}/examples/python/${example}/${example}.tesh)
+                               ${example}.tesh)
   endif()
 endforeach()
 
 set(tesh_files    examples/python/actor-create/actor-create_d.xml
                   examples/python/actor-lifetime/actor-lifetime_d.xml
-                 examples/python/actor-lifetime/actor-lifetime.py     # example broken so far
-                 examples/python/actor-lifetime/actor-lifetime.tesh
                  examples/python/async-wait/async-wait_d.xml
                  examples/python/async-waitall/async-waitall_d.xml
                  examples/python/async-waitany/async-waitany_d.xml
index c9338a9..667f01f 100644 (file)
@@ -60,11 +60,9 @@ class Receiver:
     def __init__(self, *args):
         if len(args) != 1:  # Receiver actor expects 1 argument: its ID
             raise AssertionError("Actor receiver requires 1 parameter, but got {:d}".format(len(args)))
-        self.id = int(args[0])
+        self.mbox = Mailbox.by_name("receiver-{:s}".format(args[0]))
 
     def __call__(self):
-        # FIXME: It should be ok to initialize self.mbox from __init__, but it's currently failing on the OS X Jenkins slave.
-        self.mbox = Mailbox.by_name("receiver-{:d}".format(self.id))
         this_actor.info("Wait for my first message")
         while True:
             received = self.mbox.get()
index bd48de0..f6bf29e 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -95,8 +95,8 @@ setup(
                       "sudo apt install cmake libboost-dev pybind11-dev g++ gcc"),
     ext_modules=[CMakeExtension('simgrid')],
     cmdclass=dict(build_ext=CMakeBuild),
-    install_requires=['pybind11>=2.3'],
-    setup_requires=['pybind11>=2.3'],
+    install_requires=['pybind11>=2.4'],
+    setup_requires=['pybind11>=2.4'],
     zip_safe=False,
     classifiers=[
         "Development Status :: 4 - Beta",
index 0551aa8..a392042 100644 (file)
@@ -55,6 +55,44 @@ static std::string get_simgrid_version()
   return simgrid::xbt::string_printf("%i.%i.%i", major, minor, patch);
 }
 
+/* Classes GilScopedAcquire and GilScopedRelease have the same purpose as pybind11::gil_scoped_acquire and
+ * pybind11::gil_scoped_release.  Refer to the manual of pybind11 for details:
+ * https://pybind11.readthedocs.io/en/stable/advanced/misc.html#global-interpreter-lock-gil
+ *
+ * The pybind11 versions are however too sophisticated (using TLS for example) and don't work well with all kinds of
+ * contexts.
+ * See also https://github.com/pybind/pybind11/issues/1276, which may be related.
+ *
+ * Briefly, GilScopedAcquire can be used on actor creation to acquire a new PyThreadState.  The PyThreadState has to be
+ * released for context switches (i.e. before simcalls). That's the purpose of GilScopedRelease.
+ *
+ * Like their pybind11 counterparts, both classes use a RAII pattern.
+ */
+class XBT_PRIVATE GilScopedAcquire {
+  static PyThreadState* acquire()
+  {
+    PyThreadState* state = PyThreadState_New(PyInterpreterState_Head());
+    PyEval_AcquireThread(state);
+    return state;
+  }
+  static void release(PyThreadState* state)
+  {
+    PyEval_ReleaseThread(state);
+    PyThreadState_Clear(state);
+    PyThreadState_Delete(state);
+  }
+
+  std::unique_ptr<PyThreadState, decltype(&release)> thread_state{acquire(), &release};
+
+public:
+  void reset() { thread_state.reset(); }
+};
+
+class XBT_PRIVATE GilScopedRelease {
+  std::unique_ptr<PyThreadState, decltype(&PyEval_RestoreThread)> thread_state{PyEval_SaveThread(),
+                                                                               &PyEval_RestoreThread};
+};
+
 } // namespace
 
 PYBIND11_DECLARE_HOLDER_TYPE(T, boost::intrusive_ptr<T>)
@@ -73,39 +111,44 @@ PYBIND11_MODULE(simgrid, m)
       .def("info", [](const char* s) { XBT_INFO("%s", s); }, "Display a logging message of 'info' priority.")
       .def("error", [](const char* s) { XBT_ERROR("%s", s); }, "Display a logging message of 'error' priority.")
       .def("execute", py::overload_cast<double, double>(&simgrid::s4u::this_actor::execute),
+           py::call_guard<GilScopedRelease>(),
            "Block the current actor, computing the given amount of flops at the given priority, "
            "see :cpp:func:`void simgrid::s4u::this_actor::execute(double, double)`",
            py::arg("flops"), py::arg("priority") = 1)
-      .def("exec_init", py::overload_cast<double>(&simgrid::s4u::this_actor::exec_init))
+      .def("exec_init", py::overload_cast<double>(&simgrid::s4u::this_actor::exec_init),
+           py::call_guard<GilScopedRelease>())
       .def("get_host", &simgrid::s4u::this_actor::get_host, "Retrieves host on which the current actor is located")
-      .def("set_host", &simgrid::s4u::this_actor::set_host,
+      .def("set_host", &simgrid::s4u::this_actor::set_host, py::call_guard<GilScopedRelease>(),
            "Moves the current actor to another host, see :cpp:func:`void simgrid::s4u::this_actor::set_host()`",
            py::arg("dest"))
       .def("sleep_for", static_cast<void (*)(double)>(&simgrid::s4u::this_actor::sleep_for),
-           "Block the actor sleeping for that amount of seconds, "
-           "see :cpp:func:`void simgrid::s4u::this_actor::sleep_for`",
+           py::call_guard<GilScopedRelease>(), "Block the actor sleeping for that amount of seconds, "
+                                               "see :cpp:func:`void simgrid::s4u::this_actor::sleep_for`",
            py::arg("duration"))
       .def("sleep_until", static_cast<void (*)(double)>(&simgrid::s4u::this_actor::sleep_until),
-           "Block the actor sleeping until the specified timestamp, "
-           "see :cpp:func:`void simgrid::s4u::this_actor::sleep_until`",
+           py::call_guard<GilScopedRelease>(), "Block the actor sleeping until the specified timestamp, "
+                                               "see :cpp:func:`void simgrid::s4u::this_actor::sleep_until`",
            py::arg("duration"))
-      .def("suspend", &simgrid::s4u::this_actor::suspend,
+      .def("suspend", &simgrid::s4u::this_actor::suspend, py::call_guard<GilScopedRelease>(),
            "Suspend the current actor, that is blocked until resume()ed by another actor. "
            "see :cpp:func:`void simgrid::s4u::this_actor::suspend`")
-      .def("yield_", &simgrid::s4u::this_actor::yield,
+      .def("yield_", &simgrid::s4u::this_actor::yield, py::call_guard<GilScopedRelease>(),
            "Yield the actor, see :cpp:func:`void simgrid::s4u::this_actor::yield()`")
-      .def("exit", &simgrid::s4u::this_actor::exit, "kill the current actor")
+      .def("exit", &simgrid::s4u::this_actor::exit, py::call_guard<GilScopedRelease>(), "kill the current actor")
       .def("on_exit",
            [](py::object fun) {
              simgrid::s4u::this_actor::on_exit([fun](bool /*failed*/) {
+               GilScopedAcquire py_context; // need a new context for callback
                try {
                  fun();
                } catch (const py::error_already_set& e) {
-                 xbt_die("Error while executing the on_exit lambda: %s", e.what());
+                 std::string what = e.what();
+                 py_context.reset();
+                 xbt_die("Error while executing the on_exit lambda: %s", what.c_str());
                }
              });
            },
-           "");
+           py::call_guard<GilScopedRelease>(), "");
 
   /* Class Engine */
   py::class_<Engine>(m, "Engine", "Simulation Engine, see :ref:`class s4u::Engine <API_s4u_Engine>`")
@@ -127,10 +170,11 @@ PYBIND11_MODULE(simgrid, m)
       .def("load_deployment", &Engine::load_deployment,
            "Load a deployment file and launch the actors that it contains, see "
            ":cpp:func:`simgrid::s4u::Engine::load_deployment()`")
-      .def("run", &Engine::run, "Run the simulation")
+      .def("run", &Engine::run, py::call_guard<GilScopedRelease>(), "Run the simulation")
       .def("register_actor",
            [](Engine* e, const std::string& name, py::object fun_or_class) {
              e->register_actor(name, [fun_or_class](std::vector<std::string> args) {
+               GilScopedAcquire py_context;
                try {
                  /* Convert the std::vector into a py::tuple */
                  py::tuple params(args.size() - 1);
@@ -143,12 +187,14 @@ PYBIND11_MODULE(simgrid, m)
                  if (py::isinstance<py::function>(res))
                    res();
                } catch (const py::error_already_set& ex) {
-                 if (ex.matches(pyForcefulKillEx)) {
+                 bool ffk = ex.matches(pyForcefulKillEx);
+                 py_context.reset();
+                 if (ffk) {
                    XBT_VERB("Actor killed");
-                   /* Stop here that ForcefulKill exception which was meant to free the RAII stuff on the stack */
-                 } else {
-                   throw;
+                   /* Forward that ForcefulKill exception */
+                   simgrid::ForcefulKillException::do_throw();
                  }
+                 throw;
                }
              });
            },
@@ -162,9 +208,13 @@ PYBIND11_MODULE(simgrid, m)
            "Retrieve the cound of defined pstate levels, see :cpp:func:`simgrid::s4u::Host::get_pstate_count`")
       .def("get_pstate_speed", &Host::get_pstate_speed,
            "Retrieve the maximal speed at the given pstate, see :cpp:func:`simgrid::s4u::Host::get_pstate_speed`")
-      .def_property("pstate", &Host::get_pstate, &Host::set_pstate, "The current pstate")
-
-      .def("current", &Host::current,
+      .def_property("pstate", &Host::get_pstate,
+                    [](Host* h, int i) {
+                      GilScopedRelease gil_guard;
+                      h->set_pstate(i);
+                    },
+                    "The current pstate")
+      .def("current", &Host::current, py::call_guard<GilScopedRelease>(),
            "Retrieves the host on which the running actor is located, see :cpp:func:`simgrid::s4u::Host::current()`")
       .def_property_readonly("name",
                              [](const Host* self) {
@@ -185,7 +235,7 @@ PYBIND11_MODULE(simgrid, m)
       m, "Mailbox", "Mailbox, see :ref:`class s4u::Mailbox <API_s4u_Mailbox>`")
       .def("__str__", [](const Mailbox* self) { return std::string("Mailbox(") + self->get_cname() + ")"; },
            "Textual representation of the Mailbox`")
-      .def("by_name", &Mailbox::by_name,
+      .def("by_name", &Mailbox::by_name, py::call_guard<GilScopedRelease>(),
            "Retrieve a Mailbox from its name, see :cpp:func:`simgrid::s4u::Mailbox::by_name()`")
       .def_property_readonly("name",
                              [](const Mailbox* self) {
@@ -197,42 +247,53 @@ PYBIND11_MODULE(simgrid, m)
              data.inc_ref();
              self->put(data.ptr(), size);
            },
+           py::call_guard<GilScopedRelease>(),
            "Blocking data transmission, see :cpp:func:`void simgrid::s4u::Mailbox::put(void*, uint64_t)`")
       .def("put_async",
            [](Mailbox* self, py::object data, int size) {
              data.inc_ref();
              return self->put_async(data.ptr(), size);
            },
+           py::call_guard<GilScopedRelease>(),
            "Non-blocking data transmission, see :cpp:func:`void simgrid::s4u::Mailbox::put_async(void*, uint64_t)`")
       .def("get",
            [](Mailbox* self) {
              py::object data = pybind11::reinterpret_steal<py::object>(static_cast<PyObject*>(self->get()));
-             data.dec_ref();
+             // data.dec_ref(); // FIXME: why does it break python-actor-create?
              return data;
            },
+           py::call_guard<GilScopedRelease>(),
            "Blocking data reception, see :cpp:func:`void* simgrid::s4u::Mailbox::get()`");
 
   /* Class Comm */
   py::class_<simgrid::s4u::Comm, simgrid::s4u::CommPtr>(m, "Comm",
                                                         "Communication, see :ref:`class s4u::Comm <API_s4u_Comm>`")
-      .def("test", &simgrid::s4u::Comm::test,
+      .def("test", &simgrid::s4u::Comm::test, py::call_guard<GilScopedRelease>(),
            "Test whether the communication is terminated, see :cpp:func:`simgrid::s4u::Comm::test()`")
-      .def("wait", &simgrid::s4u::Comm::wait,
+      .def("wait", &simgrid::s4u::Comm::wait, py::call_guard<GilScopedRelease>(),
            "Block until the completion of that communication, see :cpp:func:`simgrid::s4u::Comm::wait()`")
-      .def("wait_all", &simgrid::s4u::Comm::wait_all,
+      .def("wait_all", &simgrid::s4u::Comm::wait_all, py::call_guard<GilScopedRelease>(),
            "Block until the completion of all communications in the list, see "
            ":cpp:func:`simgrid::s4u::Comm::wait_all()`")
-      .def("wait_any", &simgrid::s4u::Comm::wait_any,
+      .def("wait_any", &simgrid::s4u::Comm::wait_any, py::call_guard<GilScopedRelease>(),
            "Block until the completion of any communication in the list and return the index of the terminated one, "
            "see :cpp:func:`simgrid::s4u::Comm::wait_any()`");
 
   /* Class Exec */
   py::class_<simgrid::s4u::Exec, simgrid::s4u::ExecPtr>(m, "Exec",
                                                         "Execution, see :ref:`class s4u::Exec <API_s4u_Exec>`")
-      .def_property_readonly("remaining", &simgrid::s4u::Exec::get_remaining,
+      .def_property_readonly("remaining",
+                             [](simgrid::s4u::ExecPtr self) {
+                               GilScopedRelease gil_guard;
+                               return self->get_remaining();
+                             },
                              "Amount of flops that remain to be computed until completion, see "
                              ":cpp:func:`simgrid::s4u::Exec::get_remaining()`")
-      .def_property_readonly("remaining_ratio", &simgrid::s4u::Exec::get_remaining_ratio,
+      .def_property_readonly("remaining_ratio",
+                             [](simgrid::s4u::ExecPtr self) {
+                               GilScopedRelease gil_guard;
+                               return self->get_remaining_ratio();
+                             },
                              "Amount of work remaining until completion from 0 (completely done) to 1 (nothing done "
                              "yet). See :cpp:func:`simgrid::s4u::Exec::get_remaining_ratio()`")
       .def_property("host",
@@ -245,11 +306,13 @@ PYBIND11_MODULE(simgrid, m)
                     },
                     &simgrid::s4u::Exec::set_host,
                     "Host on which this execution runs. See :cpp:func:`simgrid::s4u::ExecSeq::get_host()`")
-      .def("test", &simgrid::s4u::Exec::test,
+      .def("test", &simgrid::s4u::Exec::test, py::call_guard<GilScopedRelease>(),
            "Test whether the execution is terminated, see :cpp:func:`simgrid::s4u::Exec::test()`")
-      .def("cancel", &simgrid::s4u::Exec::cancel, "Cancel that execution, see :cpp:func:`simgrid::s4u::Exec::cancel()`")
-      .def("start", &simgrid::s4u::Exec::start, "Start that execution, see :cpp:func:`simgrid::s4u::Exec::start()`")
-      .def("wait", &simgrid::s4u::Exec::wait,
+      .def("cancel", &simgrid::s4u::Exec::cancel, py::call_guard<GilScopedRelease>(),
+           "Cancel that execution, see :cpp:func:`simgrid::s4u::Exec::cancel()`")
+      .def("start", &simgrid::s4u::Exec::start, py::call_guard<GilScopedRelease>(),
+           "Start that execution, see :cpp:func:`simgrid::s4u::Exec::start()`")
+      .def("wait", &simgrid::s4u::Exec::wait, py::call_guard<GilScopedRelease>(),
            "Block until the completion of that execution, see :cpp:func:`simgrid::s4u::Exec::wait()`");
 
   /* Class Actor */
@@ -258,38 +321,50 @@ PYBIND11_MODULE(simgrid, m)
                                             "application, see :ref:`class s4u::Actor <API_s4u_Actor>`")
       .def("create",
            [](py::str name, Host* host, py::object fun, py::args args) {
+             fun.inc_ref();  // FIXME: why is this needed for tests like exec-async, exec-dvfs and exec-remote?
+             args.inc_ref(); // FIXME: why is this needed for tests like actor-migrate?
              return simgrid::s4u::Actor::create(name, host, [fun, args]() {
+               GilScopedAcquire py_context;
                try {
                  fun(*args);
                } catch (const py::error_already_set& ex) {
-                 if (ex.matches(pyForcefulKillEx)) {
+                 bool ffk = ex.matches(pyForcefulKillEx);
+                 py_context.reset();
+                 if (ffk) {
                    XBT_VERB("Actor killed");
-                   /* Stop here that ForcefulKill exception which was meant to free the RAII stuff on the stack */
-                 } else {
-                   throw;
+                   /* Forward that ForcefulKill exception */
+                   simgrid::ForcefulKillException::do_throw();
                  }
+                 throw;
                }
              });
            },
-           "Create an actor from a function or an object.")
-      .def_property("host", &Actor::get_host, &Actor::set_host, "The host on which this actor is located")
+           py::call_guard<GilScopedRelease>(), "Create an actor from a function or an object.")
+      .def_property("host", &Actor::get_host,
+                    [](Actor* a, Host* h) {
+                      GilScopedRelease gil_guard;
+                      a->set_host(h);
+                    },
+                    "The host on which this actor is located")
       .def_property_readonly("name", &Actor::get_cname, "The name of this actor.")
       .def_property_readonly("pid", &Actor::get_pid, "The PID (unique identifier) of this actor.")
       .def_property_readonly("ppid", &Actor::get_ppid,
                              "The PID (unique identifier) of the actor that created this one.")
       .def("by_pid", &Actor::by_pid, "Retrieve an actor by its PID")
-      .def("daemonize", &Actor::daemonize,
+      .def("daemonize", &Actor::daemonize, py::call_guard<GilScopedRelease>(),
            "This actor will be automatically terminated when the last non-daemon actor finishes (more info in the C++ "
            "documentation).")
       .def("is_daemon", &Actor::is_daemon,
            "Returns True if that actor is a daemon and will be terminated automatically when the last non-daemon actor "
            "terminates.")
-      .def("join", py::overload_cast<double>(&Actor::join),
+      .def("join", py::overload_cast<double>(&Actor::join), py::call_guard<GilScopedRelease>(),
            "Wait for the actor to finish (more info in the C++ documentation).", py::arg("timeout"))
-      .def("kill", &Actor::kill, "Kill that actor")
-      .def("kill_all", &Actor::kill_all, "Kill all actors but the caller.")
+      .def("kill", &Actor::kill, py::call_guard<GilScopedRelease>(), "Kill that actor")
+      .def("kill_all", &Actor::kill_all, py::call_guard<GilScopedRelease>(), "Kill all actors but the caller.")
       .def("self", &Actor::self, "Retrieves the current actor.")
       .def("is_suspended", &Actor::is_suspended, "Returns True if that actor is currently suspended.")
-      .def("suspend", &Actor::suspend, "Suspend that actor, that is blocked until resume()ed by another actor.")
-      .def("resume", &Actor::resume, "Resume that actor, that was previously suspend()ed.");
+      .def("suspend", &Actor::suspend, py::call_guard<GilScopedRelease>(),
+           "Suspend that actor, that is blocked until resume()ed by another actor.")
+      .def("resume", &Actor::resume, py::call_guard<GilScopedRelease>(),
+           "Resume that actor, that was previously suspend()ed.");
 }
diff --git a/teshsuite/python/CMakeLists.txt b/teshsuite/python/CMakeLists.txt
new file mode 100644 (file)
index 0000000..2375ad5
--- /dev/null
@@ -0,0 +1,19 @@
+foreach(example borken-context corrupt-stack)
+  set(tesh_files    ${tesh_files}   ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}.tesh
+                                    ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}_d.xml)
+  set(examples_src  ${examples_src} ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}.py)
+
+  if(enable_python)
+    ADD_TESH_FACTORIES(tesh-python-${example} "thread;ucontext;raw;boost"
+                               --setenv srcdir=${CMAKE_CURRENT_SOURCE_DIR}/${example}
+                               --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms
+                               --setenv pythoncmd=${PYTHON_EXECUTABLE}
+                              --setenv LD_LIBRARY_PATH=${TESH_LIBRARY_PATH}
+                              --setenv PYTHONPATH=${CMAKE_BINARY_DIR}/lib
+                              --cd ${CMAKE_CURRENT_SOURCE_DIR}/${example}
+                               ${example}.tesh)
+  endif()
+endforeach()
+
+set(tesh_files    ${tesh_files}    PARENT_SCOPE)
+set(examples_src  ${examples_src}  PARENT_SCOPE)
diff --git a/teshsuite/python/borken-context/borken-context.py b/teshsuite/python/borken-context/borken-context.py
new file mode 100644 (file)
index 0000000..1f4206a
--- /dev/null
@@ -0,0 +1,39 @@
+# Copyright (c) 2019-2020. 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.
+
+# First failing example for bug #9 on Framagit (Python bindings crashing)
+#
+# A heavy operation is added after e.run() (here, it's "import gc"). Note that
+# the failure only occurs when the actor "sender" starts first, and the
+# scheduling is interlaced: sender starts, receiver starts, sender terminates,
+# receiver terminates.
+
+import sys
+from simgrid import Engine, this_actor
+
+def sender():
+    this_actor.sleep_for(3)
+    this_actor.info("Goodbye now!")
+
+def receiver():
+    this_actor.sleep_for(5)
+    this_actor.info("Five seconds elapsed")
+
+if __name__ == '__main__':
+    e = Engine(sys.argv)
+
+    e.load_platform(sys.argv[1])             # Load the platform description
+
+    # Register the classes representing the actors
+    e.register_actor("sender", sender)
+    e.register_actor("receiver", receiver)
+
+    e.load_deployment(sys.argv[2])
+
+    e.run()
+    this_actor.info("Dummy import...")
+    import gc
+    gc.collect()
+    this_actor.info("done.")
diff --git a/teshsuite/python/borken-context/borken-context.tesh b/teshsuite/python/borken-context/borken-context.tesh
new file mode 100644 (file)
index 0000000..cb6e84e
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/env tesh
+
+$ ${pythoncmd:=python3} ${PYTHON_TOOL_OPTIONS:=} ${bindir:=.}/borken-context.py ${platfdir}/small_platform_fatpipe.xml borken-context_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  3.000000] (1:sender@Tremblay) Goodbye now!
+> [  5.000000] (2:receiver@Ruby) Five seconds elapsed
+> [  5.000000] (0:maestro@) Dummy import...
+> [  5.000000] (0:maestro@) done.
diff --git a/teshsuite/python/borken-context/borken-context_d.xml b/teshsuite/python/borken-context/borken-context_d.xml
new file mode 100644 (file)
index 0000000..5a83f51
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "https://simgrid.org/simgrid.dtd">
+<platform version="4.1">
+  <actor host="Tremblay" function="sender"/>
+  <actor host="Ruby" function="receiver"/>
+</platform>
diff --git a/teshsuite/python/corrupt-stack/corrupt-stack.py b/teshsuite/python/corrupt-stack/corrupt-stack.py
new file mode 100644 (file)
index 0000000..8ac2d92
--- /dev/null
@@ -0,0 +1,62 @@
+# Copyright (c) 2019-2020. 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.
+
+# Second failing example for bug #9 on Framagit (Python bindings crashing)
+#
+# An intricate recursion is used to make the crash happen.
+
+import sys
+from simgrid import Engine, this_actor
+
+def do_sleep1(i, dur):
+    if i > 0:
+        this_actor.info("1-Iter {:d}".format(i))
+        do_sleep3(i - 1, dur)
+        this_actor.sleep_for(dur)
+        this_actor.info("1-Mid ({:d})".format(i))
+        do_sleep3(int(i / 2), dur)
+        this_actor.info("1-Done ({:d})".format(i))
+
+def do_sleep3(i, dur):
+    if i > 0:
+        this_actor.info("3-Iter {:d}".format(i))
+        do_sleep5(i - 1, dur)
+        this_actor.sleep_for(dur)
+        this_actor.info("3-Mid ({:d})".format(i))
+        do_sleep5(int(i / 2), dur)
+        this_actor.info("3-Done ({:d})".format(i))
+
+def do_sleep5(i, dur):
+    if i > 0:
+        this_actor.info("5-Iter {:d}".format(i))
+        do_sleep1(i - 1, dur)
+        this_actor.sleep_for(dur)
+        this_actor.info("5-Mid ({:d})".format(i))
+        do_sleep1(int(i / 2), dur)
+        this_actor.info("5-Done ({:d})".format(i))
+
+def sleeper1():
+    do_sleep1(16, 1)
+
+def sleeper3():
+    do_sleep3(6, 3)
+
+def sleeper5():
+    do_sleep5(4, 5)
+
+if __name__ == '__main__':
+    e = Engine(sys.argv)
+
+    e.load_platform(sys.argv[1])             # Load the platform description
+
+    # Register the classes representing the actors
+    e.register_actor("sleeper1", sleeper1)
+    e.register_actor("sleeper3", sleeper3)
+    e.register_actor("sleeper5", sleeper5)
+
+    e.load_deployment(sys.argv[2])
+
+    e.run()
+    this_actor.info("Finalize!")
diff --git a/teshsuite/python/corrupt-stack/corrupt-stack.tesh b/teshsuite/python/corrupt-stack/corrupt-stack.tesh
new file mode 100644 (file)
index 0000000..ea86071
--- /dev/null
@@ -0,0 +1,691 @@
+#!/usr/bin/env tesh
+
+$ ${pythoncmd:=python3} ${PYTHON_TOOL_OPTIONS:=} ${bindir:=.}/corrupt-stack.py ${platfdir}/small_platform_fatpipe.xml corrupt-stack_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (1:sleeper3@Ruby) 3-Iter 6
+> [  0.000000] (1:sleeper3@Ruby) 5-Iter 5
+> [  0.000000] (1:sleeper3@Ruby) 1-Iter 4
+> [  0.000000] (1:sleeper3@Ruby) 3-Iter 3
+> [  0.000000] (1:sleeper3@Ruby) 5-Iter 2
+> [  0.000000] (1:sleeper3@Ruby) 1-Iter 1
+> [  0.000000] (2:sleeper1@Tremblay) 1-Iter 16
+> [  0.000000] (2:sleeper1@Tremblay) 3-Iter 15
+> [  0.000000] (2:sleeper1@Tremblay) 5-Iter 14
+> [  0.000000] (2:sleeper1@Tremblay) 1-Iter 13
+> [  0.000000] (2:sleeper1@Tremblay) 3-Iter 12
+> [  0.000000] (2:sleeper1@Tremblay) 5-Iter 11
+> [  0.000000] (2:sleeper1@Tremblay) 1-Iter 10
+> [  0.000000] (2:sleeper1@Tremblay) 3-Iter 9
+> [  0.000000] (2:sleeper1@Tremblay) 5-Iter 8
+> [  0.000000] (2:sleeper1@Tremblay) 1-Iter 7
+> [  0.000000] (2:sleeper1@Tremblay) 3-Iter 6
+> [  0.000000] (2:sleeper1@Tremblay) 5-Iter 5
+> [  0.000000] (2:sleeper1@Tremblay) 1-Iter 4
+> [  0.000000] (2:sleeper1@Tremblay) 3-Iter 3
+> [  0.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [  0.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [  0.000000] (3:sleeper5@Java) 5-Iter 4
+> [  0.000000] (3:sleeper5@Java) 1-Iter 3
+> [  0.000000] (3:sleeper5@Java) 3-Iter 2
+> [  0.000000] (3:sleeper5@Java) 5-Iter 1
+> [  1.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [  1.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [  2.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [  2.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [  3.000000] (1:sleeper3@Ruby) 1-Mid (1)
+> [  3.000000] (1:sleeper3@Ruby) 1-Done (1)
+> [  3.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [  3.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [  3.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [  4.000000] (2:sleeper1@Tremblay) 3-Mid (3)
+> [  4.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [  5.000000] (3:sleeper5@Java) 5-Mid (1)
+> [  5.000000] (3:sleeper5@Java) 5-Done (1)
+> [  5.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [  5.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [  5.000000] (2:sleeper1@Tremblay) 3-Done (3)
+> [  6.000000] (1:sleeper3@Ruby) 5-Mid (2)
+> [  6.000000] (1:sleeper3@Ruby) 1-Iter 1
+> [  6.000000] (2:sleeper1@Tremblay) 1-Mid (4)
+> [  6.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [  6.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [  7.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [  7.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [  8.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [  8.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [  9.000000] (1:sleeper3@Ruby) 1-Mid (1)
+> [  9.000000] (1:sleeper3@Ruby) 1-Done (1)
+> [  9.000000] (1:sleeper3@Ruby) 5-Done (2)
+> [  9.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [  9.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [  9.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [  9.000000] (2:sleeper1@Tremblay) 1-Done (4)
+> [ 10.000000] (3:sleeper5@Java) 3-Mid (2)
+> [ 10.000000] (3:sleeper5@Java) 5-Iter 1
+> [ 10.000000] (2:sleeper1@Tremblay) 5-Mid (5)
+> [ 10.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [ 10.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 11.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 11.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 12.000000] (1:sleeper3@Ruby) 3-Mid (3)
+> [ 12.000000] (1:sleeper3@Ruby) 5-Iter 1
+> [ 12.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [ 12.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 13.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 13.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 13.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [ 13.000000] (2:sleeper1@Tremblay) 5-Done (5)
+> [ 14.000000] (2:sleeper1@Tremblay) 3-Mid (6)
+> [ 14.000000] (2:sleeper1@Tremblay) 5-Iter 3
+> [ 14.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [ 14.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 15.000000] (3:sleeper5@Java) 5-Mid (1)
+> [ 15.000000] (3:sleeper5@Java) 5-Done (1)
+> [ 15.000000] (3:sleeper5@Java) 3-Done (2)
+> [ 15.000000] (1:sleeper3@Ruby) 5-Mid (1)
+> [ 15.000000] (1:sleeper3@Ruby) 5-Done (1)
+> [ 15.000000] (1:sleeper3@Ruby) 3-Done (3)
+> [ 15.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 15.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 16.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [ 16.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 17.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 17.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 17.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [ 18.000000] (1:sleeper3@Ruby) 1-Mid (4)
+> [ 18.000000] (1:sleeper3@Ruby) 3-Iter 2
+> [ 18.000000] (1:sleeper3@Ruby) 5-Iter 1
+> [ 18.000000] (2:sleeper1@Tremblay) 5-Mid (3)
+> [ 18.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 19.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 19.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 19.000000] (2:sleeper1@Tremblay) 5-Done (3)
+> [ 19.000000] (2:sleeper1@Tremblay) 3-Done (6)
+> [ 20.000000] (3:sleeper5@Java) 1-Mid (3)
+> [ 20.000000] (3:sleeper5@Java) 3-Iter 1
+> [ 20.000000] (2:sleeper1@Tremblay) 1-Mid (7)
+> [ 20.000000] (2:sleeper1@Tremblay) 3-Iter 3
+> [ 20.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [ 20.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 21.000000] (1:sleeper3@Ruby) 5-Mid (1)
+> [ 21.000000] (1:sleeper3@Ruby) 5-Done (1)
+> [ 21.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 21.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 22.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [ 22.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 23.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 23.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 23.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [ 24.000000] (1:sleeper3@Ruby) 3-Mid (2)
+> [ 24.000000] (1:sleeper3@Ruby) 5-Iter 1
+> [ 24.000000] (2:sleeper1@Tremblay) 3-Mid (3)
+> [ 24.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 25.000000] (3:sleeper5@Java) 3-Mid (1)
+> [ 25.000000] (3:sleeper5@Java) 3-Done (1)
+> [ 25.000000] (3:sleeper5@Java) 1-Done (3)
+> [ 25.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 25.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 25.000000] (2:sleeper1@Tremblay) 3-Done (3)
+> [ 25.000000] (2:sleeper1@Tremblay) 1-Done (7)
+> [ 26.000000] (2:sleeper1@Tremblay) 5-Mid (8)
+> [ 26.000000] (2:sleeper1@Tremblay) 1-Iter 4
+> [ 26.000000] (2:sleeper1@Tremblay) 3-Iter 3
+> [ 26.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [ 26.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 27.000000] (1:sleeper3@Ruby) 5-Mid (1)
+> [ 27.000000] (1:sleeper3@Ruby) 5-Done (1)
+> [ 27.000000] (1:sleeper3@Ruby) 3-Done (2)
+> [ 27.000000] (1:sleeper3@Ruby) 1-Done (4)
+> [ 27.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 27.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 28.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [ 28.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 29.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 29.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 29.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [ 30.000000] (3:sleeper5@Java) 5-Mid (4)
+> [ 30.000000] (3:sleeper5@Java) 1-Iter 2
+> [ 30.000000] (3:sleeper5@Java) 3-Iter 1
+> [ 30.000000] (1:sleeper3@Ruby) 5-Mid (5)
+> [ 30.000000] (1:sleeper3@Ruby) 1-Iter 2
+> [ 30.000000] (1:sleeper3@Ruby) 3-Iter 1
+> [ 30.000000] (2:sleeper1@Tremblay) 3-Mid (3)
+> [ 30.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 31.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 31.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 31.000000] (2:sleeper1@Tremblay) 3-Done (3)
+> [ 32.000000] (2:sleeper1@Tremblay) 1-Mid (4)
+> [ 32.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [ 32.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 33.000000] (1:sleeper3@Ruby) 3-Mid (1)
+> [ 33.000000] (1:sleeper3@Ruby) 3-Done (1)
+> [ 33.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 33.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 34.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [ 34.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 35.000000] (3:sleeper5@Java) 3-Mid (1)
+> [ 35.000000] (3:sleeper5@Java) 3-Done (1)
+> [ 35.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 35.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 35.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [ 35.000000] (2:sleeper1@Tremblay) 1-Done (4)
+> [ 35.000000] (2:sleeper1@Tremblay) 5-Done (8)
+> [ 36.000000] (1:sleeper3@Ruby) 1-Mid (2)
+> [ 36.000000] (1:sleeper3@Ruby) 3-Iter 1
+> [ 36.000000] (2:sleeper1@Tremblay) 3-Mid (9)
+> [ 36.000000] (2:sleeper1@Tremblay) 5-Iter 4
+> [ 36.000000] (2:sleeper1@Tremblay) 1-Iter 3
+> [ 36.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [ 36.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 37.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 37.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 38.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [ 38.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 39.000000] (1:sleeper3@Ruby) 3-Mid (1)
+> [ 39.000000] (1:sleeper3@Ruby) 3-Done (1)
+> [ 39.000000] (1:sleeper3@Ruby) 1-Done (2)
+> [ 39.000000] (1:sleeper3@Ruby) 5-Done (5)
+> [ 39.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 39.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 39.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [ 40.000000] (3:sleeper5@Java) 1-Mid (2)
+> [ 40.000000] (3:sleeper5@Java) 3-Iter 1
+> [ 40.000000] (2:sleeper1@Tremblay) 1-Mid (3)
+> [ 40.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 41.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 41.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 41.000000] (2:sleeper1@Tremblay) 1-Done (3)
+> [ 42.000000] (1:sleeper3@Ruby) 3-Mid (6)
+> [ 42.000000] (1:sleeper3@Ruby) 5-Iter 3
+> [ 42.000000] (1:sleeper3@Ruby) 1-Iter 2
+> [ 42.000000] (1:sleeper3@Ruby) 3-Iter 1
+> [ 42.000000] (2:sleeper1@Tremblay) 5-Mid (4)
+> [ 42.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [ 42.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 43.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 43.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 44.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [ 44.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 45.000000] (3:sleeper5@Java) 3-Mid (1)
+> [ 45.000000] (3:sleeper5@Java) 3-Done (1)
+> [ 45.000000] (3:sleeper5@Java) 1-Done (2)
+> [ 45.000000] (3:sleeper5@Java) 5-Done (4)
+> [ 45.000000] (1:sleeper3@Ruby) 3-Mid (1)
+> [ 45.000000] (1:sleeper3@Ruby) 3-Done (1)
+> [ 45.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 45.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 45.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [ 45.000000] (2:sleeper1@Tremblay) 5-Done (4)
+> [ 45.000000] (2:sleeper1@Tremblay) 3-Done (9)
+> [ 46.000000] (2:sleeper1@Tremblay) 1-Mid (10)
+> [ 46.000000] (2:sleeper1@Tremblay) 3-Iter 5
+> [ 46.000000] (2:sleeper1@Tremblay) 5-Iter 4
+> [ 46.000000] (2:sleeper1@Tremblay) 1-Iter 3
+> [ 46.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [ 46.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 47.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 47.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 48.000000] (1:sleeper3@Ruby) 1-Mid (2)
+> [ 48.000000] (1:sleeper3@Ruby) 3-Iter 1
+> [ 48.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [ 48.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 49.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 49.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 49.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [ 50.000000] (2:sleeper1@Tremblay) 1-Mid (3)
+> [ 50.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 51.000000] (1:sleeper3@Ruby) 3-Mid (1)
+> [ 51.000000] (1:sleeper3@Ruby) 3-Done (1)
+> [ 51.000000] (1:sleeper3@Ruby) 1-Done (2)
+> [ 51.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 51.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 51.000000] (2:sleeper1@Tremblay) 1-Done (3)
+> [ 52.000000] (2:sleeper1@Tremblay) 5-Mid (4)
+> [ 52.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [ 52.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 53.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 53.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 54.000000] (1:sleeper3@Ruby) 5-Mid (3)
+> [ 54.000000] (1:sleeper3@Ruby) 1-Iter 1
+> [ 54.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [ 54.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 55.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 55.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 55.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [ 55.000000] (2:sleeper1@Tremblay) 5-Done (4)
+> [ 56.000000] (2:sleeper1@Tremblay) 3-Mid (5)
+> [ 56.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [ 56.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 57.000000] (1:sleeper3@Ruby) 1-Mid (1)
+> [ 57.000000] (1:sleeper3@Ruby) 1-Done (1)
+> [ 57.000000] (1:sleeper3@Ruby) 5-Done (3)
+> [ 57.000000] (1:sleeper3@Ruby) 3-Done (6)
+> [ 57.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 57.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 58.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [ 58.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 59.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 59.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 59.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [ 59.000000] (2:sleeper1@Tremblay) 3-Done (5)
+> [ 59.000000] (2:sleeper1@Tremblay) 1-Done (10)
+> [ 60.000000] (2:sleeper1@Tremblay) 5-Mid (11)
+> [ 60.000000] (2:sleeper1@Tremblay) 1-Iter 5
+> [ 60.000000] (2:sleeper1@Tremblay) 3-Iter 4
+> [ 60.000000] (2:sleeper1@Tremblay) 5-Iter 3
+> [ 60.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [ 60.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 61.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 61.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 62.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [ 62.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 63.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 63.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 63.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [ 64.000000] (2:sleeper1@Tremblay) 5-Mid (3)
+> [ 64.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 65.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 65.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 65.000000] (2:sleeper1@Tremblay) 5-Done (3)
+> [ 66.000000] (2:sleeper1@Tremblay) 3-Mid (4)
+> [ 66.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [ 66.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 67.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 67.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 68.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [ 68.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 69.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 69.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 69.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [ 69.000000] (2:sleeper1@Tremblay) 3-Done (4)
+> [ 70.000000] (2:sleeper1@Tremblay) 1-Mid (5)
+> [ 70.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [ 70.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 71.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 71.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 72.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [ 72.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 73.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 73.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 73.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [ 73.000000] (2:sleeper1@Tremblay) 1-Done (5)
+> [ 73.000000] (2:sleeper1@Tremblay) 5-Done (11)
+> [ 74.000000] (2:sleeper1@Tremblay) 3-Mid (12)
+> [ 74.000000] (2:sleeper1@Tremblay) 5-Iter 6
+> [ 74.000000] (2:sleeper1@Tremblay) 1-Iter 5
+> [ 74.000000] (2:sleeper1@Tremblay) 3-Iter 4
+> [ 74.000000] (2:sleeper1@Tremblay) 5-Iter 3
+> [ 74.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [ 74.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 75.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 75.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 76.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [ 76.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 77.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 77.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 77.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [ 78.000000] (2:sleeper1@Tremblay) 5-Mid (3)
+> [ 78.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 79.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 79.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 79.000000] (2:sleeper1@Tremblay) 5-Done (3)
+> [ 80.000000] (2:sleeper1@Tremblay) 3-Mid (4)
+> [ 80.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [ 80.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 81.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 81.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 82.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [ 82.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 83.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 83.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 83.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [ 83.000000] (2:sleeper1@Tremblay) 3-Done (4)
+> [ 84.000000] (2:sleeper1@Tremblay) 1-Mid (5)
+> [ 84.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [ 84.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 85.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 85.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 86.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [ 86.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 87.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 87.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 87.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [ 87.000000] (2:sleeper1@Tremblay) 1-Done (5)
+> [ 88.000000] (2:sleeper1@Tremblay) 5-Mid (6)
+> [ 88.000000] (2:sleeper1@Tremblay) 1-Iter 3
+> [ 88.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [ 88.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 89.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 89.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 90.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [ 90.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 91.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 91.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 91.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [ 92.000000] (2:sleeper1@Tremblay) 1-Mid (3)
+> [ 92.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [ 93.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [ 93.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [ 93.000000] (2:sleeper1@Tremblay) 1-Done (3)
+> [ 93.000000] (2:sleeper1@Tremblay) 5-Done (6)
+> [ 93.000000] (2:sleeper1@Tremblay) 3-Done (12)
+> [ 94.000000] (2:sleeper1@Tremblay) 1-Mid (13)
+> [ 94.000000] (2:sleeper1@Tremblay) 3-Iter 6
+> [ 94.000000] (2:sleeper1@Tremblay) 5-Iter 5
+> [ 94.000000] (2:sleeper1@Tremblay) 1-Iter 4
+> [ 94.000000] (2:sleeper1@Tremblay) 3-Iter 3
+> [ 94.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [ 94.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 95.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 95.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 96.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [ 96.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [ 97.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [ 97.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [ 97.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [ 98.000000] (2:sleeper1@Tremblay) 3-Mid (3)
+> [ 98.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [ 99.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [ 99.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [ 99.000000] (2:sleeper1@Tremblay) 3-Done (3)
+> [100.000000] (2:sleeper1@Tremblay) 1-Mid (4)
+> [100.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [100.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [101.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [101.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [102.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [102.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [103.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [103.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [103.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [103.000000] (2:sleeper1@Tremblay) 1-Done (4)
+> [104.000000] (2:sleeper1@Tremblay) 5-Mid (5)
+> [104.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [104.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [105.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [105.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [106.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [106.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [107.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [107.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [107.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [107.000000] (2:sleeper1@Tremblay) 5-Done (5)
+> [108.000000] (2:sleeper1@Tremblay) 3-Mid (6)
+> [108.000000] (2:sleeper1@Tremblay) 5-Iter 3
+> [108.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [108.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [109.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [109.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [110.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [110.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [111.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [111.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [111.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [112.000000] (2:sleeper1@Tremblay) 5-Mid (3)
+> [112.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [113.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [113.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [113.000000] (2:sleeper1@Tremblay) 5-Done (3)
+> [113.000000] (2:sleeper1@Tremblay) 3-Done (6)
+> [113.000000] (2:sleeper1@Tremblay) 1-Done (13)
+> [114.000000] (2:sleeper1@Tremblay) 5-Mid (14)
+> [114.000000] (2:sleeper1@Tremblay) 1-Iter 7
+> [114.000000] (2:sleeper1@Tremblay) 3-Iter 6
+> [114.000000] (2:sleeper1@Tremblay) 5-Iter 5
+> [114.000000] (2:sleeper1@Tremblay) 1-Iter 4
+> [114.000000] (2:sleeper1@Tremblay) 3-Iter 3
+> [114.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [114.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [115.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [115.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [116.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [116.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [117.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [117.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [117.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [118.000000] (2:sleeper1@Tremblay) 3-Mid (3)
+> [118.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [119.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [119.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [119.000000] (2:sleeper1@Tremblay) 3-Done (3)
+> [120.000000] (2:sleeper1@Tremblay) 1-Mid (4)
+> [120.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [120.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [121.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [121.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [122.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [122.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [123.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [123.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [123.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [123.000000] (2:sleeper1@Tremblay) 1-Done (4)
+> [124.000000] (2:sleeper1@Tremblay) 5-Mid (5)
+> [124.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [124.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [125.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [125.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [126.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [126.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [127.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [127.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [127.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [127.000000] (2:sleeper1@Tremblay) 5-Done (5)
+> [128.000000] (2:sleeper1@Tremblay) 3-Mid (6)
+> [128.000000] (2:sleeper1@Tremblay) 5-Iter 3
+> [128.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [128.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [129.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [129.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [130.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [130.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [131.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [131.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [131.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [132.000000] (2:sleeper1@Tremblay) 5-Mid (3)
+> [132.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [133.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [133.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [133.000000] (2:sleeper1@Tremblay) 5-Done (3)
+> [133.000000] (2:sleeper1@Tremblay) 3-Done (6)
+> [134.000000] (2:sleeper1@Tremblay) 1-Mid (7)
+> [134.000000] (2:sleeper1@Tremblay) 3-Iter 3
+> [134.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [134.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [135.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [135.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [136.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [136.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [137.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [137.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [137.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [138.000000] (2:sleeper1@Tremblay) 3-Mid (3)
+> [138.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [139.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [139.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [139.000000] (2:sleeper1@Tremblay) 3-Done (3)
+> [139.000000] (2:sleeper1@Tremblay) 1-Done (7)
+> [139.000000] (2:sleeper1@Tremblay) 5-Done (14)
+> [140.000000] (2:sleeper1@Tremblay) 3-Mid (15)
+> [140.000000] (2:sleeper1@Tremblay) 5-Iter 7
+> [140.000000] (2:sleeper1@Tremblay) 1-Iter 6
+> [140.000000] (2:sleeper1@Tremblay) 3-Iter 5
+> [140.000000] (2:sleeper1@Tremblay) 5-Iter 4
+> [140.000000] (2:sleeper1@Tremblay) 1-Iter 3
+> [140.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [140.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [141.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [141.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [142.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [142.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [143.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [143.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [143.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [144.000000] (2:sleeper1@Tremblay) 1-Mid (3)
+> [144.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [145.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [145.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [145.000000] (2:sleeper1@Tremblay) 1-Done (3)
+> [146.000000] (2:sleeper1@Tremblay) 5-Mid (4)
+> [146.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [146.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [147.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [147.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [148.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [148.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [149.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [149.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [149.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [149.000000] (2:sleeper1@Tremblay) 5-Done (4)
+> [150.000000] (2:sleeper1@Tremblay) 3-Mid (5)
+> [150.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [150.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [151.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [151.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [152.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [152.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [153.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [153.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [153.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [153.000000] (2:sleeper1@Tremblay) 3-Done (5)
+> [154.000000] (2:sleeper1@Tremblay) 1-Mid (6)
+> [154.000000] (2:sleeper1@Tremblay) 3-Iter 3
+> [154.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [154.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [155.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [155.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [156.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [156.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [157.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [157.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [157.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [158.000000] (2:sleeper1@Tremblay) 3-Mid (3)
+> [158.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [159.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [159.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [159.000000] (2:sleeper1@Tremblay) 3-Done (3)
+> [159.000000] (2:sleeper1@Tremblay) 1-Done (6)
+> [160.000000] (2:sleeper1@Tremblay) 5-Mid (7)
+> [160.000000] (2:sleeper1@Tremblay) 1-Iter 3
+> [160.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [160.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [161.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [161.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [162.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [162.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [163.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [163.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [163.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [164.000000] (2:sleeper1@Tremblay) 1-Mid (3)
+> [164.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [165.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [165.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [165.000000] (2:sleeper1@Tremblay) 1-Done (3)
+> [165.000000] (2:sleeper1@Tremblay) 5-Done (7)
+> [165.000000] (2:sleeper1@Tremblay) 3-Done (15)
+> [166.000000] (2:sleeper1@Tremblay) 1-Mid (16)
+> [166.000000] (2:sleeper1@Tremblay) 3-Iter 8
+> [166.000000] (2:sleeper1@Tremblay) 5-Iter 7
+> [166.000000] (2:sleeper1@Tremblay) 1-Iter 6
+> [166.000000] (2:sleeper1@Tremblay) 3-Iter 5
+> [166.000000] (2:sleeper1@Tremblay) 5-Iter 4
+> [166.000000] (2:sleeper1@Tremblay) 1-Iter 3
+> [166.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [166.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [167.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [167.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [168.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [168.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [169.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [169.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [169.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [170.000000] (2:sleeper1@Tremblay) 1-Mid (3)
+> [170.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [171.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [171.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [171.000000] (2:sleeper1@Tremblay) 1-Done (3)
+> [172.000000] (2:sleeper1@Tremblay) 5-Mid (4)
+> [172.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [172.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [173.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [173.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [174.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [174.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [175.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [175.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [175.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [175.000000] (2:sleeper1@Tremblay) 5-Done (4)
+> [176.000000] (2:sleeper1@Tremblay) 3-Mid (5)
+> [176.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [176.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [177.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [177.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [178.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [178.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [179.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [179.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [179.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [179.000000] (2:sleeper1@Tremblay) 3-Done (5)
+> [180.000000] (2:sleeper1@Tremblay) 1-Mid (6)
+> [180.000000] (2:sleeper1@Tremblay) 3-Iter 3
+> [180.000000] (2:sleeper1@Tremblay) 5-Iter 2
+> [180.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [181.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [181.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [182.000000] (2:sleeper1@Tremblay) 5-Mid (2)
+> [182.000000] (2:sleeper1@Tremblay) 1-Iter 1
+> [183.000000] (2:sleeper1@Tremblay) 1-Mid (1)
+> [183.000000] (2:sleeper1@Tremblay) 1-Done (1)
+> [183.000000] (2:sleeper1@Tremblay) 5-Done (2)
+> [184.000000] (2:sleeper1@Tremblay) 3-Mid (3)
+> [184.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [185.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [185.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [185.000000] (2:sleeper1@Tremblay) 3-Done (3)
+> [185.000000] (2:sleeper1@Tremblay) 1-Done (6)
+> [186.000000] (2:sleeper1@Tremblay) 5-Mid (7)
+> [186.000000] (2:sleeper1@Tremblay) 1-Iter 3
+> [186.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [186.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [187.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [187.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [188.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [188.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [189.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [189.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [189.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [190.000000] (2:sleeper1@Tremblay) 1-Mid (3)
+> [190.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [191.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [191.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [191.000000] (2:sleeper1@Tremblay) 1-Done (3)
+> [191.000000] (2:sleeper1@Tremblay) 5-Done (7)
+> [192.000000] (2:sleeper1@Tremblay) 3-Mid (8)
+> [192.000000] (2:sleeper1@Tremblay) 5-Iter 4
+> [192.000000] (2:sleeper1@Tremblay) 1-Iter 3
+> [192.000000] (2:sleeper1@Tremblay) 3-Iter 2
+> [192.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [193.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [193.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [194.000000] (2:sleeper1@Tremblay) 3-Mid (2)
+> [194.000000] (2:sleeper1@Tremblay) 5-Iter 1
+> [195.000000] (2:sleeper1@Tremblay) 5-Mid (1)
+> [195.000000] (2:sleeper1@Tremblay) 5-Done (1)
+> [195.000000] (2:sleeper1@Tremblay) 3-Done (2)
+> [196.000000] (2:sleeper1@Tremblay) 1-Mid (3)
+> [196.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [197.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [197.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [197.000000] (2:sleeper1@Tremblay) 1-Done (3)
+> [198.000000] (2:sleeper1@Tremblay) 5-Mid (4)
+> [198.000000] (2:sleeper1@Tremblay) 1-Iter 2
+> [198.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [199.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [199.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [200.000000] (2:sleeper1@Tremblay) 1-Mid (2)
+> [200.000000] (2:sleeper1@Tremblay) 3-Iter 1
+> [201.000000] (2:sleeper1@Tremblay) 3-Mid (1)
+> [201.000000] (2:sleeper1@Tremblay) 3-Done (1)
+> [201.000000] (2:sleeper1@Tremblay) 1-Done (2)
+> [201.000000] (2:sleeper1@Tremblay) 5-Done (4)
+> [201.000000] (2:sleeper1@Tremblay) 3-Done (8)
+> [201.000000] (2:sleeper1@Tremblay) 1-Done (16)
+> [201.000000] (0:maestro@) Finalize!
diff --git a/teshsuite/python/corrupt-stack/corrupt-stack_d.xml b/teshsuite/python/corrupt-stack/corrupt-stack_d.xml
new file mode 100644 (file)
index 0000000..c3fe94c
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "https://simgrid.org/simgrid.dtd">
+<platform version="4.1">
+  <actor host="Ruby" function="sleeper3"/>
+  <actor host="Tremblay" function="sleeper1"/>
+  <actor host="Java" function="sleeper5"/>
+</platform>
index 15812e4..2511c87 100644 (file)
@@ -1012,6 +1012,7 @@ set(CMAKEFILES_TXT
   teshsuite/lua/CMakeLists.txt
   teshsuite/mc/CMakeLists.txt
   teshsuite/msg/CMakeLists.txt
+  teshsuite/python/CMakeLists.txt
   teshsuite/s4u/CMakeLists.txt
   teshsuite/simdag/CMakeLists.txt
   teshsuite/simix/CMakeLists.txt