- /* 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));
-
- DEBUG4("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++;
+ while ((i = __sync_fetch_and_add(&parmap->index, 1))
+ < xbt_dynar_length(parmap->data)) {
+ parmap->fun(xbt_dynar_get_as(parmap->data, i, void*));
+ n++;