- xbt_os_mutex_acquire(parmap->mutex);
- parmap->flags[worker_id] = PARMAP_WAIT;
- parmap->num_idle_workers++;
-
- /* If everybody is done set the parmap work flag and signal it */
- if(parmap->num_idle_workers == parmap->num_workers){
- DEBUG1("Worker %u: All done, signal the parmap", worker_id);
- parmap->flags[parmap->num_workers] = PARMAP_WORK;
- xbt_os_cond_signal(parmap->all_done);
+#ifdef HAVE_FUTEX_H
+ xbt_event_wait(parmap->sync_event);
+#endif
+ if(parmap->status == PARMAP_WORK){
+ XBT_DEBUG("Worker %u got a job", worker_id);
+
+ /* Compute how much data does every worker gets */
+ data_size = (xbt_dynar_length(parmap->data) / parmap->num_workers)
+ + ((xbt_dynar_length(parmap->data) % parmap->num_workers) ? 1 : 0);
+
+ /* Each worker data segment starts in a position associated with its id*/
+ data_start = data_size * worker_id;
+
+ /* The end of the worker data segment must be bounded by the end of the data vector */
+ data_end = MIN(data_start + data_size, xbt_dynar_length(parmap->data));
+
+ XBT_DEBUG("Worker %u: data_start=%u data_end=%u (data_size=%u)",
+ worker_id, data_start, data_end, data_size);
+
+ /* While the worker don't pass the end of it data segment apply the function */
+ while(data_start < data_end){
+ parmap->fun(*(void **)xbt_dynar_get_ptr(parmap->data, data_start));
+ data_start++;
+ }
+
+ /* We are destroying the parmap */
+ }else{
+#ifdef HAVE_FUTEX_H
+ xbt_event_end(parmap->sync_event);
+#endif
+ XBT_DEBUG("Shutting down worker %u", worker_id);
+ return NULL;