From: Millian Poquet Date: Mon, 1 Oct 2018 17:31:25 +0000 (+0200) Subject: [examples] add s4u-synchro-semaphore X-Git-Tag: v3_21~15^2^2 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/71d4334465ce8d44107336c35e5968f5342ae7d0 [examples] add s4u-synchro-semaphore This example does a barrier with one semaphore and one mutex. --- diff --git a/examples/s4u/CMakeLists.txt b/examples/s4u/CMakeLists.txt index 9ae63e2ac8..b9ed396239 100644 --- a/examples/s4u/CMakeLists.txt +++ b/examples/s4u/CMakeLists.txt @@ -12,7 +12,7 @@ foreach (example actor-create actor-daemon actor-join actor-kill platform-failures platform-properties plugin-hostload replay-comm replay-storage routing-get-clusters - synchro-barrier synchro-mutex + synchro-barrier synchro-mutex synchro-semaphore trace-platform) add_executable (s4u-${example} ${example}/s4u-${example}.cpp) target_link_libraries(s4u-${example} simgrid) @@ -109,7 +109,7 @@ foreach(example actor-create actor-daemon actor-join actor-kill io-async io-file-system io-file-remote io-storage-raw replay-comm replay-storage routing-get-clusters - synchro-barrier synchro-mutex + synchro-barrier synchro-mutex synchro-semaphore ) ADD_TESH_FACTORIES(s4u-${example} "thread;ucontext;raw;boost" --setenv bindir=${CMAKE_CURRENT_BINARY_DIR}/${example} diff --git a/examples/s4u/synchro-semaphore/s4u-synchro-semaphore.cpp b/examples/s4u/synchro-semaphore/s4u-synchro-semaphore.cpp new file mode 100644 index 0000000000..8c96391e57 --- /dev/null +++ b/examples/s4u/synchro-semaphore/s4u-synchro-semaphore.cpp @@ -0,0 +1,67 @@ +/* Copyright (c) 2006-2018. 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" + +#include + +XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "a sample log category"); + +// This example implements a one-time use barrier with 1 semaphore and 1 mutex. + +static void worker(simgrid::s4u::SemaphorePtr semaphore, simgrid::s4u::MutexPtr mutex, int process_count, std::shared_ptr count) +{ + mutex->lock(); + XBT_INFO("Got mutex. Incrementing count."); + XBT_INFO("Count is %d", *count); + *count = (*count) + 1; + XBT_INFO("Count is now %d. Process count is %d.", *count, process_count); + + if (*count == process_count) { + XBT_INFO("Releasing the semaphore %d times.", process_count-1); + for (int i = 0; i < process_count-1; i++) { + semaphore->release(); + } + + XBT_INFO("Releasing mutex."); + mutex->unlock(); + } + else { + XBT_INFO("Releasing mutex."); + mutex->unlock(); + XBT_INFO("Acquiring semaphore."); + semaphore->acquire(); + } + + XBT_INFO("Bye!"); +} + +static void master(unsigned int process_count) +{ + simgrid::s4u::SemaphorePtr semaphore = simgrid::s4u::Semaphore::create(0); + simgrid::s4u::MutexPtr mutex = simgrid::s4u::Mutex::create(); + std::shared_ptr count(new int); + *count = 0; + + XBT_INFO("Spawning %d workers", process_count); + for (unsigned int i = 0; i < process_count; i++) { + simgrid::s4u::Actor::create("worker", simgrid::s4u::Host::by_name("Jupiter"), worker, semaphore, mutex, process_count, count); + } +} + +int main(int argc, char **argv) +{ + // Parameter: Number of processes in the barrier + xbt_assert(argc >= 2, "Usage: %s \n", argv[0]); + unsigned int process_count = std::stoi(argv[1]); + xbt_assert(process_count > 0, " must be greater than 0"); + + simgrid::s4u::Engine e(&argc, argv); + e.load_platform("../../platforms/two_hosts.xml"); + simgrid::s4u::Actor::create("master", simgrid::s4u::Host::by_name("Tremblay"), master, process_count); + e.run(); + + return 0; +} diff --git a/examples/s4u/synchro-semaphore/s4u-synchro-semaphore.tesh b/examples/s4u/synchro-semaphore/s4u-synchro-semaphore.tesh new file mode 100644 index 0000000000..477a7a07e3 --- /dev/null +++ b/examples/s4u/synchro-semaphore/s4u-synchro-semaphore.tesh @@ -0,0 +1,109 @@ +#!/usr/bin/env tesh + +$ $SG_TEST_EXENV ${bindir:=.}/s4u-synchro-semaphore 1 +> [Tremblay:master:(1) 0.000000] [s4u_test/INFO] Spawning 1 workers +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Count is 0 +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Count is now 1. Process count is 1. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Releasing the semaphore 0 times. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Bye! + +$ $SG_TEST_EXENV ${bindir:=.}/s4u-synchro-semaphore 2 +> [Tremblay:master:(1) 0.000000] [s4u_test/INFO] Spawning 2 workers +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Count is 0 +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Count is now 1. Process count is 2. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Count is 1 +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Count is now 2. Process count is 2. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Releasing the semaphore 1 times. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Bye! + +$ $SG_TEST_EXENV ${bindir:=.}/s4u-synchro-semaphore 3 +> [Tremblay:master:(1) 0.000000] [s4u_test/INFO] Spawning 3 workers +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Count is 0 +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Count is now 1. Process count is 3. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Count is 1 +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Count is now 2. Process count is 3. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Count is 2 +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Count is now 3. Process count is 3. +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Releasing the semaphore 2 times. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Bye! + +$ $SG_TEST_EXENV ${bindir:=.}/s4u-synchro-semaphore 10 +> [Tremblay:master:(1) 0.000000] [s4u_test/INFO] Spawning 10 workers +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Count is 0 +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Count is now 1. Process count is 10. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Count is 1 +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Count is now 2. Process count is 10. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Count is 2 +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Count is now 3. Process count is 10. +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(5) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(5) 0.000000] [s4u_test/INFO] Count is 3 +> [Jupiter:worker:(5) 0.000000] [s4u_test/INFO] Count is now 4. Process count is 10. +> [Jupiter:worker:(5) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(5) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(6) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(6) 0.000000] [s4u_test/INFO] Count is 4 +> [Jupiter:worker:(6) 0.000000] [s4u_test/INFO] Count is now 5. Process count is 10. +> [Jupiter:worker:(6) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(6) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(7) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(7) 0.000000] [s4u_test/INFO] Count is 5 +> [Jupiter:worker:(7) 0.000000] [s4u_test/INFO] Count is now 6. Process count is 10. +> [Jupiter:worker:(7) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(7) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(8) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(8) 0.000000] [s4u_test/INFO] Count is 6 +> [Jupiter:worker:(8) 0.000000] [s4u_test/INFO] Count is now 7. Process count is 10. +> [Jupiter:worker:(8) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(8) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(9) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(9) 0.000000] [s4u_test/INFO] Count is 7 +> [Jupiter:worker:(9) 0.000000] [s4u_test/INFO] Count is now 8. Process count is 10. +> [Jupiter:worker:(9) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(9) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(10) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(10) 0.000000] [s4u_test/INFO] Count is 8 +> [Jupiter:worker:(10) 0.000000] [s4u_test/INFO] Count is now 9. Process count is 10. +> [Jupiter:worker:(10) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(10) 0.000000] [s4u_test/INFO] Acquiring semaphore. +> [Jupiter:worker:(11) 0.000000] [s4u_test/INFO] Got mutex. Incrementing count. +> [Jupiter:worker:(11) 0.000000] [s4u_test/INFO] Count is 9 +> [Jupiter:worker:(11) 0.000000] [s4u_test/INFO] Count is now 10. Process count is 10. +> [Jupiter:worker:(11) 0.000000] [s4u_test/INFO] Releasing the semaphore 9 times. +> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(3) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(4) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(5) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(6) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(7) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(8) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(9) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(10) 0.000000] [s4u_test/INFO] Bye! +> [Jupiter:worker:(11) 0.000000] [s4u_test/INFO] Releasing mutex. +> [Jupiter:worker:(11) 0.000000] [s4u_test/INFO] Bye!