-/* Copyright (c) 2004-2005, 2007, 2009-2014. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2004-2017. 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. */
switch (mode) {
case XBT_PARMAP_POSIX:
- parmap->master_wait_f = xbt_parmap_posix_master_wait;
- parmap->worker_signal_f = xbt_parmap_posix_worker_signal;
- parmap->master_signal_f = xbt_parmap_posix_master_signal;
- parmap->worker_wait_f = xbt_parmap_posix_worker_wait;
+ parmap->master_wait_f = &xbt_parmap_posix_master_wait;
+ parmap->worker_signal_f = &xbt_parmap_posix_worker_signal;
+ parmap->master_signal_f = &xbt_parmap_posix_master_signal;
+ parmap->worker_wait_f = &xbt_parmap_posix_worker_wait;
parmap->ready_cond = xbt_os_cond_init();
parmap->ready_mutex = xbt_os_mutex_init();
break;
case XBT_PARMAP_FUTEX:
#if HAVE_FUTEX_H
- parmap->master_wait_f = xbt_parmap_futex_master_wait;
- parmap->worker_signal_f = xbt_parmap_futex_worker_signal;
- parmap->master_signal_f = xbt_parmap_futex_master_signal;
- parmap->worker_wait_f = xbt_parmap_futex_worker_wait;
+ parmap->master_wait_f = &xbt_parmap_futex_master_wait;
+ parmap->worker_signal_f = &xbt_parmap_futex_worker_signal;
+ parmap->master_signal_f = &xbt_parmap_futex_master_signal;
+ parmap->worker_wait_f = &xbt_parmap_futex_worker_wait;
xbt_os_cond_destroy(parmap->ready_cond);
xbt_os_mutex_destroy(parmap->ready_mutex);
xbt_die("Futex is not available on this OS.");
#endif
case XBT_PARMAP_BUSY_WAIT:
- parmap->master_wait_f = xbt_parmap_busy_master_wait;
- parmap->worker_signal_f = xbt_parmap_busy_worker_signal;
- parmap->master_signal_f = xbt_parmap_busy_master_signal;
- parmap->worker_wait_f = xbt_parmap_busy_worker_wait;
+ parmap->master_wait_f = &xbt_parmap_busy_master_wait;
+ parmap->worker_signal_f = &xbt_parmap_busy_worker_signal;
+ parmap->master_signal_f = &xbt_parmap_busy_master_signal;
+ parmap->worker_wait_f = &xbt_parmap_busy_worker_wait;
xbt_os_cond_destroy(parmap->ready_cond);
xbt_os_mutex_destroy(parmap->ready_mutex);
static void xbt_parmap_work(xbt_parmap_t parmap)
{
- unsigned index;
- while ((index = parmap->index++) < xbt_dynar_length(parmap->data))
+ unsigned int index = parmap->index++;
+ while (index < xbt_dynar_length(parmap->data)){
parmap->fun(xbt_dynar_get_as(parmap->data, index, void*));
+ index = parmap->index++;
+ }
}
/**
*/
static void *xbt_parmap_worker_main(void *arg)
{
- xbt_parmap_thread_data_t data = (xbt_parmap_thread_data_t) arg;
+ xbt_parmap_thread_data_t data = static_cast<xbt_parmap_thread_data_t>(arg);
xbt_parmap_t parmap = data->parmap;
unsigned round = 0;
smx_context_t context = SIMIX_context_new(std::function<void()>(), nullptr, nullptr);
/* Worker's main loop */
while (1) {
- parmap->worker_wait_f(parmap, ++round);
+ round++;
+ parmap->worker_wait_f(parmap, round);
if (parmap->status == XBT_PARMAP_WORK) {
XBT_DEBUG("Worker %d got a job", data->worker_id);
static void xbt_parmap_posix_worker_signal(xbt_parmap_t parmap)
{
xbt_os_mutex_acquire(parmap->done_mutex);
- if (++parmap->thread_counter == parmap->num_workers) {
+ parmap->thread_counter++;
+ if (parmap->thread_counter == parmap->num_workers) {
/* all workers have finished, wake the controller */
xbt_os_cond_signal(parmap->done_cond);
}