#include <parlib/stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <parlib/parlib.h>
#include <unistd.h>
#include <sys/time.h>

pthread_barrier_t barrier;

#define MAX_NR_TEST_THREADS 100000
int nr_threads = 100;
int nr_loops = 10000;
int nr_vcores = 0;

pthread_t *my_threads;
void **my_retvals;
bool run_barriertest = FALSE;

void *thread(void *arg)
{	
	while (!run_barriertest)
		cpu_relax();
	for(int i = 0; i < nr_loops; i++) {
		pthread_barrier_wait(&barrier);
	}
	return (void*)(long)pthread_self()->id;
}

int main(int argc, char** argv) 
{
	struct timeval start_tv = {0};
	struct timeval end_tv = {0};
	long usec_diff;
	if (argc > 1)
		nr_threads = strtol(argv[1], 0, 10);
	if (argc > 2)
		nr_loops = strtol(argv[2], 0, 10);
	if (argc > 3)
		nr_vcores = strtol(argv[3], 0, 10);
	printf("Running %d threads for %d iterations on %d vcores\n",
	       nr_threads, nr_loops, nr_vcores);
	nr_threads = MIN(nr_threads, MAX_NR_TEST_THREADS);
	my_threads = malloc(sizeof(pthread_t) * nr_threads);
	my_retvals = malloc(sizeof(void*) * nr_threads);
	if (!(my_retvals && my_threads))
		perror("Init threads/malloc");
	if (nr_vcores) {
		/* Only do the vcore trickery if requested */
		parlib_never_yield = TRUE;
		pthread_mcp_init();					/* gives us one vcore */
		vcore_request_total(nr_vcores);
		parlib_never_vc_request = TRUE;
		for (int i = 0; i < nr_vcores; i++) {
			printd("Vcore %d mapped to pcore %d\n", i,
				   __procinfo.vcoremap[i].pcoreid);
		}
	}
	pthread_barrier_init(&barrier, NULL, nr_threads);
	for (int i = 0; i < nr_threads; i++) {
		pthread_create(&my_threads[i], NULL, &thread, NULL);
	}
	if (gettimeofday(&start_tv, 0))
		perror("Start time error...");
	run_barriertest = TRUE;
	for (int i = 0; i < nr_threads; i++) {
		pthread_join(my_threads[i], &my_retvals[i]);
	}
	if (gettimeofday(&end_tv, 0))
		perror("End time error...");
	pthread_barrier_destroy(&barrier);
	usec_diff = (end_tv.tv_sec - start_tv.tv_sec) * 1000000 +
	            (end_tv.tv_usec - start_tv.tv_usec);
	printf("Done: %d threads, %d loops, %d vcores\n",
	       nr_threads, nr_loops, nr_vcores);
	printf("Time to run: %d usec, %f usec per barrier\n", usec_diff,
	       (float)usec_diff / nr_loops);
	pthread_barrier_destroy(&barrier);
} 
