X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6c7604885c4f97e09bdb2a869a9fe20810a6ad82..9afa0d0db01da2ae64e48fb594cc87c186dde192:/teshsuite/s4u/monkey-semaphore/monkey-semaphore.cpp diff --git a/teshsuite/s4u/monkey-semaphore/monkey-semaphore.cpp b/teshsuite/s4u/monkey-semaphore/monkey-semaphore.cpp index 3612aad873..6e73575767 100644 --- a/teshsuite/s4u/monkey-semaphore/monkey-semaphore.cpp +++ b/teshsuite/s4u/monkey-semaphore/monkey-semaphore.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2022. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2006-2023. 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. */ @@ -18,7 +18,7 @@ static simgrid::config::Flag cfg_deadline{"deadline", "When to fail the 120}; struct SharedBuffer { - int value; /* Where the data is exchanged */ + int value = 0; /* Where the data is exchanged */ sg4::SemaphorePtr sem_empty = sg4::Semaphore::create(1); /* indicates whether the buffer is empty */ sg4::SemaphorePtr sem_full = sg4::Semaphore::create(0); /* indicates whether the buffer is full */ }; @@ -28,14 +28,14 @@ class SemStack { std::vector to_release; public: - SemStack() = default; - SemStack(const SemStack&) = delete; - SemStack& operator=(const SemStack&) = delete; - ~SemStack() + void clear() { - for (auto* sem : to_release) { + while (not to_release.empty()) { + auto* sem = to_release.back(); + XBT_INFO("Go release a semaphore"); sem->release(); - XBT_INFO("Released a semaphore on exit. It's now %d", sem->get_capacity()); + XBT_INFO("Released a semaphore on reboot. It's now %d", sem->get_capacity()); + to_release.pop_back(); } } void push(const sg4::SemaphorePtr& sem) { to_release.push_back(sem.get()); } @@ -44,25 +44,24 @@ public: static void producer(SharedBuffer& buf) { - static bool inited = false; static int todo = cfg_item_count; // remaining amount of items to exchange - SemStack to_release; - XBT_INFO("Producer %s", inited ? "rebooting" : "booting"); + static SemStack to_release; + bool rebooting = sg4::Actor::self()->get_restart_count() > 0; - if (not inited) { + XBT_INFO("Producer %s", rebooting ? "rebooting" : "booting"); + if (not rebooting) // Starting for the first time sg4::this_actor::on_exit( [](bool forcefully) { XBT_INFO("Producer dying %s.", forcefully ? "forcefully" : "peacefully"); }); - inited = true; - } + to_release.clear(); while (todo > 0) { - xbt_assert(sg4::Engine::get_clock() < cfg_deadline, - "Failed to exchange all tasks in less than %d seconds. Is this an infinite loop?", (int)cfg_deadline); - sg4::this_actor::sleep_for(1); // Give a chance to the monkey to kill this actor at this point - while (buf.sem_empty->acquire_timeout(10)) + while (buf.sem_empty->acquire_timeout(10)) { XBT_INFO("Timeouted"); + xbt_assert(sg4::Engine::get_clock() < cfg_deadline, + "Failed to exchange all tasks in less than %d seconds. Is this an infinite loop?", (int)cfg_deadline); + } to_release.push(buf.sem_empty); XBT_INFO("sem_empty acquired"); @@ -79,25 +78,24 @@ static void producer(SharedBuffer& buf) static void consumer(const SharedBuffer& buf) { - SemStack to_release; + static SemStack to_release; + bool rebooting = sg4::Actor::self()->get_restart_count() > 0; - static bool inited = false; - XBT_INFO("Consumer %s", inited ? "rebooting" : "booting"); - if (not inited) { + XBT_INFO("Consumer %s", rebooting ? "rebooting" : "booting"); + if (not rebooting) // Starting for the first time sg4::this_actor::on_exit( [](bool forcefully) { XBT_INFO("Consumer dying %s.", forcefully ? "forcefully" : "peacefully"); }); - inited = true; - } + to_release.clear(); int item; do { - xbt_assert(sg4::Engine::get_clock() < cfg_deadline, - "Failed to exchange all tasks in less than %d seconds. Is this an infinite loop?", (int)cfg_deadline); - sg4::this_actor::sleep_for(0.75); // Give a chance to the monkey to kill this actor at this point - while (buf.sem_full->acquire_timeout(10)) + while (buf.sem_full->acquire_timeout(10)) { XBT_INFO("Timeouted"); + xbt_assert(sg4::Engine::get_clock() < cfg_deadline, + "Failed to exchange all tasks in less than %d seconds. Is this an infinite loop?", (int)cfg_deadline); + } to_release.push(buf.sem_full); sg4::this_actor::sleep_for(0.75); // Give a chance to the monkey to kill this actor at this point @@ -118,8 +116,8 @@ int main(int argc, char** argv) auto* rootzone = sg4::create_full_zone("root"); auto* paul = rootzone->create_host("Paul", 1e9); auto* carol = rootzone->create_host("Carol", 1e9); - sg4::LinkInRoute link(rootzone->create_link("link", "1MBps")->set_latency("24us")->seal()); - rootzone->add_route(paul->get_netpoint(), carol->get_netpoint(), nullptr, nullptr, {link}, true); + auto* link = rootzone->create_link("link", "1MBps")->set_latency("24us")->seal(); + rootzone->add_route(paul, carol, {link}); SharedBuffer buffer; sg4::Actor::create("producer", paul, producer, std::ref(buffer))->set_auto_restart();