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, ¶ms); do_op(ft, params.fs, params.opnum); ffsb_milli_sleep(wait_time); } return NULL; }
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; }