blob: 11497cec1ea79935ed6ed07ee2aa0afe0cdbcc64 [file] [log] [blame]
/* 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);
}