void xbt_parmap_destroy(xbt_parmap_t parmap)
{
- XBT_DEBUG("Destroy parmap %p", parmap);
parmap->status = PARMAP_DESTROY;
#ifdef HAVE_FUTEX_H
xbt_event_signal(parmap->sync_event);
XBT_DEBUG("Job done");
}
+void* xbt_parmap_next(xbt_parmap_t parmap) {
+
+ unsigned int index = __sync_fetch_and_add(&parmap->index, 1);
+ if (index < xbt_dynar_length(parmap->data)) {
+ return xbt_dynar_get_as(parmap->data, index, void*);
+ }
+ return NULL;
+}
+
+unsigned long xbt_parmap_get_worker_id(xbt_parmap_t parmap) {
+ return (unsigned long) xbt_os_thread_get_extra_data();
+}
+
static void *_xbt_parmap_worker_main(void *arg)
{
unsigned int worker_id;
- xbt_parmap_t parmap = (xbt_parmap_t)arg;
+ xbt_parmap_t parmap = (xbt_parmap_t) arg;
/* Fetch a worker id */
worker_id = __sync_fetch_and_add(&parmap->workers_max_id, 1);
- xbt_os_thread_set_extra_data((void *)(unsigned long)worker_id);
+ xbt_os_thread_set_extra_data((void*) (unsigned long) worker_id);
XBT_DEBUG("New worker thread created (%u)", worker_id);
/* Worker's main loop */
- while(1){
+ while (1) {
#ifdef HAVE_FUTEX_H
xbt_event_wait(parmap->sync_event);
#endif
- if(parmap->status == PARMAP_WORK){
- unsigned int i;
- unsigned int n = 0;
+ if (parmap->status == PARMAP_WORK) {
XBT_DEBUG("Worker %u got a job", worker_id);
- 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++;
+ void* work = xbt_parmap_next(parmap);
+ if (work != NULL) {
+ parmap->fun(work);
}
- XBT_DEBUG("Worker %u processed %u tasks", worker_id, n);
+ XBT_DEBUG("Worker %u has finished", worker_id);
/* We are destroying the parmap */
- }else{
+ } else {
#ifdef HAVE_FUTEX_H
xbt_event_end(parmap->sync_event);
#endif