Beispiel #1
0
void *ft_run(void *data)
{
	ffsb_thread_t *ft = (ffsb_thread_t *)data;
	tg_op_params_t params;
	unsigned wait_time = tg_get_waittime(ft->tg);
	int stopval = tg_get_stopval(ft->tg);

	ffsb_barrier_wait(tg_get_start_barrier(ft->tg));

	while (tg_get_flagval(ft->tg) != stopval) {
		tg_get_op(ft->tg, &ft->rd, &params);
		do_op(ft, params.fs, params.opnum);
		ffsb_milli_sleep(wait_time);
	}
	return NULL;
}
Beispiel #2
0
void *tg_run(void *data)
{
	tg_run_params_t *params = (tg_run_params_t *)data;
	ffsb_tg_t *tg = params->tg;
	int i;
	pthread_attr_t attr;

	pthread_attr_init(&attr);
	pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);

	tg->start_barrier = params->thread_barrier;

	/* Sum up the weights for use later by tg_get_op() */
	tg->sum_weights = 0;
	for (i = 0; i < FFSB_NUMOPS; i++)
		tg->sum_weights += tg->op_weights[i];

	tg->fc = params->fc;
	tg->flagval = -1;
	tg->stopval = 1;

	/* spawn threads */
	for (i = 0; i < tg->num_threads; i++) {
		ffsb_thread_t *ft = &tg->threads[i];
		pthread_create(&ft->ptid, &attr, ft_run, ft);
	}

	if (params->tg_barrier)
		ffsb_barrier_wait(params->tg_barrier);

	/* wait for termination condition to be true */
	do {
		ffsb_sleep(params->wait_time);
	} while (params->poll_fn(params->poll_data) == 0);

	/* set flag value */
	tg->flagval = tg->stopval;

	/* wait on theads to finish */
	for (i = 0; i < tg->num_threads; i++)
		pthread_join(tg->threads[i].ptid, NULL);

	return NULL;
}