コード例 #1
0
ファイル: job.c プロジェクト: DanielASCarmo/cap-benchmarks
void add_job (job_queue_t *q, job_t j) {
	COND_VAR_MUTEX_LOCK(q->cond_var);
	assert (q->end < (int)q->max_size);
	q->buffer[q->end].tsp_job.len = j.len;
	memcpy (&q->buffer[q->end].tsp_job.path, j.path, sizeof(path_t));
	q->end++;
	COND_VAR_SIGNAL(q->cond_var);
	COND_VAR_MUTEX_UNLOCK(q->cond_var);
}
コード例 #2
0
ファイル: job.c プロジェクト: DanielASCarmo/cap-benchmarks
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;
} 
コード例 #3
0
ファイル: main.c プロジェクト: mbcastro/tsp
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);
}