+ if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose))
+ name = xbt_str_join(action, " ");
+
+ if (barrier_semaphore == NULL) // first arriving on the barrier
+ barrier_semaphore = SIMIX_sem_init(0);
+ DEBUG2("Entering barrier: %s (capacity: %d)", name,SIMIX_sem_get_capacity(barrier_semaphore));
+
+ if (SIMIX_sem_get_capacity(barrier_semaphore) == -communicator_size + 1) { // last arriving
+ SIMIX_sem_release_forever(barrier_semaphore);
+ SIMIX_sem_destroy(barrier_semaphore);
+ barrier_semaphore = NULL;
+ } else { // not last
+ SIMIX_sem_acquire(barrier_semaphore);
+ }
+
+ DEBUG1("Exiting barrier: %s", name);
+
+ if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose))
+ free(name);