/* Copyright (c) 2014 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * mmap_test: dumping ground for various tests, such as PFs on files. */

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

#include <sys/mman.h>
#include <fcntl.h>
#include <parlib/parlib.h>
#include <parlib/timing.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
	
void *addr = 0;
size_t nr_pgs = 1;
#define STRIDE 256

static void mmap_test(void)
{
	assert(addr);
	for (int *i = addr; (void*)i < addr + nr_pgs * PGSIZE; i += STRIDE) {
		*i += 1;
	}
}

void *worker_thread(void* arg)
{	
	while (1) {
		mmap_test();
		uthread_sleep(1);
	}
	return 0;
}

int main(int argc, char** argv) 
{
	pthread_t child;
	void *child_ret;
	int fd;
	struct stat statbuf;

	if (argc < 2) {
		printf("Usage: %s FILENAME [NR_PGS]\n", argv[0]);
		exit(-1);
	}
	/* if you're going to create, you'll need to seek too */
	//fd = open(argv[1], O_RDWR | O_CREAT, 0666);
	fd = open(argv[1], O_RDWR, 0666);
	if (fd < 0) {
		perror("Unable to open file");
		exit(-1);
	}
	if (argc < 3)
		nr_pgs = 1;
	else
		nr_pgs = atoi(argv[2]);
	if (fstat(fd, &statbuf)) {
		perror("Stat failed");
		exit(-1);
	}
	nr_pgs = MIN(nr_pgs, (ROUNDUP(statbuf.st_size, PGSIZE) >> PGSHIFT));
	addr = mmap(0, nr_pgs * PGSIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
		    0);
	if (addr == MAP_FAILED) {
		perror("mmap failed");
		exit(-1);
	}
	printf("Running as an SCP\n");
	mmap_test();
	printf("Spawning worker thread, etc...\n");
	pthread_create(&child, NULL, &worker_thread, NULL);
	pthread_join(child, &child_ret);
} 
