-/* 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. */
xbt_parmap_set_mode(parmap, mode);
/* Create the pool of worker threads */
- xbt_parmap_thread_data_t data;
parmap->workers[0] = nullptr;
#if HAVE_PTHREAD_SETAFFINITY
int core_bind = 0;
-#endif
+#endif
for (unsigned int i = 1; i < num_workers; i++) {
- data = xbt_new0(s_xbt_parmap_thread_data_t, 1);
+ xbt_parmap_thread_data_t data = xbt_new0(s_xbt_parmap_thread_data_t, 1);
data->parmap = parmap;
data->worker_id = i;
parmap->workers[i] = xbt_os_thread_create(nullptr, xbt_parmap_worker_main, data, nullptr);
#if HAVE_PTHREAD_SETAFFINITY
- xbt_os_thread_bind(parmap->workers[i], core_bind);
- if (core_bind != xbt_os_get_numcores())
+ xbt_os_thread_bind(parmap->workers[i], core_bind);
+ if (core_bind != xbt_os_get_numcores() - 1)
core_bind++;
else
- core_bind = 0;
+ core_bind = 0;
#endif
}
return parmap;
*/
void xbt_parmap_destroy(xbt_parmap_t parmap)
{
- if (!parmap) {
+ if (not parmap) {
return;
}
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);
case XBT_PARMAP_DEFAULT:
THROW_IMPOSSIBLE;
break;
+ default:
+ THROW_IMPOSSIBLE;
}
}
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);
}