X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5ae4444e56c58d6a957263114cff7d81ff48f6a8..cb6448e71a64791c262d6c40c050cc0b8d8ed184:/examples/s4u/actions-comm/s4u_actions-comm.cpp?ds=sidebyside diff --git a/examples/s4u/actions-comm/s4u_actions-comm.cpp b/examples/s4u/actions-comm/s4u_actions-comm.cpp index cc773519aa..3e14881899 100644 --- a/examples/s4u/actions-comm/s4u_actions-comm.cpp +++ b/examples/s4u/actions-comm/s4u_actions-comm.cpp @@ -3,6 +3,8 @@ /* 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 + #include "simgrid/msg.h" #include "simgrid/simix.h" /* semaphores for the barrier */ #include @@ -55,10 +57,12 @@ static void asynchronous_cleanup(void) process_globals_t globals = (process_globals_t) MSG_process_get_data(MSG_process_self()); /* Destroy any isend which correspond to completed communications */ - int found; msg_comm_t comm; - while ((found = MSG_comm_testany(globals->isends)) != -1) { - xbt_dynar_remove_at(globals->isends, found, &comm); + while (true) { + int pos_found = MSG_comm_testany(globals->isends); + if (pos_found == -1) /* none remaining */ + break; + xbt_dynar_remove_at(globals->isends, pos_found, &comm); MSG_comm_destroy(comm); } } @@ -170,13 +174,16 @@ static void action_barrier(const char *const *action) processes_arrived_sofar = 0; } ACT_DEBUG("Entering barrier: %s (%d already there)", NAME, processes_arrived_sofar); - mutex->lock(); - if (++processes_arrived_sofar == communicator_size) { - cond->notify_all(); - mutex->unlock(); - } else { - cond->wait(mutex); - mutex->unlock(); + + { + std::unique_lock lock(*mutex); + if (++processes_arrived_sofar == communicator_size) { + // We can notify without the lock: + lock.unlock(); + cond->notify_all(); + } else { + cond->wait(lock); + } } ACT_DEBUG("Exiting barrier: %s", NAME);