+ XBT_DEBUG("New worker thread created (%u)", worker_id);
+
+ /* Worker's main loop */
+ while(1){
+#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;
+ }
+ }