int get_job (job_queue_t *q, job_t *j) { int index; #ifdef NO_CACHE_COHERENCE __k1_rmb(); #endif if(q->begin == q->end && q->status == QUEUE_CLOSED) return 0; COND_VAR_MUTEX_LOCK(q->cond_var); while (q->begin == q->end) { switch (q->status) { case QUEUE_CLOSED: COND_VAR_MUTEX_UNLOCK(q->cond_var); return 0; case QUEUE_WAIT: #ifdef NO_CACHE_COHERENCE waiting_threads++; //see close_queue() COND_VAR_WAIT(q->cond_var); waiting_threads--; #else COND_VAR_WAIT(q->cond_var); #endif break; case QUEUE_OK: q->status = QUEUE_WAIT; reset_queue(q); COND_VAR_MUTEX_UNLOCK(q->cond_var); int jobs_added = q->repopulate_queue(q->repopulate_queue_par); COND_VAR_MUTEX_LOCK(q->cond_var); if (jobs_added) q->status = QUEUE_OK; else close_queue(q); } } index = q->begin++; COND_VAR_MUTEX_UNLOCK(q->cond_var); memcpy(j, &q->buffer[index].tsp_job, sizeof(job_t)); return 1; }
void wait_barrier (barrier_par_t barrier_par) { int limit = barrier_par.int_t; COND_VAR_MUTEX_LOCK(sync_barrier); running_count++; if (running_count == limit) { running_count = 0; COND_VAR_BROADCAST(sync_barrier); } else COND_VAR_WAIT(sync_barrier); COND_VAR_MUTEX_UNLOCK(sync_barrier); }