| /* 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); | 
 | }  |