-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfoo.c
111 lines (87 loc) · 3.08 KB
/
foo.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <unistd.h>
#include <mpi.h>
#include "errmacros.h"
#include "foo.h"
#include "collfs.h"
#include "libc-collfs-private.h" /* So that we can call the wrapped versions directly */
extern int MPI_Comm_rank ( MPI_Comm comm, int *rank ) __attribute__ ((weak));
int foo(const char *path)
{
int fd,err,rank;
unsigned int sum,value;
struct stat64 st;
if (MPI_Comm_rank) {
err = MPI_Comm_rank(MPI_COMM_WORLD,&rank);CHK(err);
}
else rank = -1;
fd = __collfs_open(path,O_RDONLY);
if (fd < 0) ERR("[%d] open(\"%s\",O_RDONLY) failed",rank,path);
sum = 0;
err = __collfs_lseek(fd,0,SEEK_SET); CHK(err);
long pagesize;
char* pa;
pagesize = sysconf(_SC_PAGESIZE);
pa = __collfs_mmap((void *)0,pagesize,PROT_READ,MAP_PRIVATE,fd,(off_t)0);
if (pa == MAP_FAILED) ERR("[%d] mmap(%d,pagesize) failed",rank,fd);
while (__collfs_libc_read(fd,&value,sizeof value) == sizeof value) {
sum ^= value;
}
err = __collfs_munmap(pa,pagesize); CHK(err);
err = __collfs_close(fd); CHK(err);
printf("[%d] XOR-sum of \"%s\": %x\n",rank,path,sum);
err = __collfs_xstat64(_STAT_VER, path, &st);CHK(err);
printf("[%d] %s (via __collfs_xstat64): inode %ld size %ld\n", rank, path, (long)st.st_ino, (long)st.st_size);
return 0;
}
int foo2_inner(const char *path)
{
int err, fd, off, nc;
char buf[4], *ptr, *ptr2;
fd = __collfs_open(path, O_RDONLY);
if (!fd) return -1;
off = __collfs_lseek(fd, 0, SEEK_SET);
if (off != 0) ERR("lseek SET");
nc = __collfs_libc_read(fd, buf, 2);
if (nc != 2) ERR("read [%d] but expected 2\nbuf: %4.4s", nc, buf);
if (strncmp(buf, "ab", 2)) ERR("wrong content");
if (__collfs_libc_read(fd, buf, 3) != 3) ERR("read");
if (strncmp(buf, "cde", 3)) ERR("wrong repeat read");
off = __collfs_lseek(fd, 8, SEEK_CUR);
if (off != 13) ERR("lseek CUR");
if (__collfs_libc_read(fd, buf, 3) != 3) ERR("read");
if (strncmp(buf, "nop", 3)) ERR("wrong content");
off = __collfs_lseek(fd, 5, SEEK_SET);
if (off != 5) ERR("lseek SET");
if (__collfs_libc_read(fd, buf, 3) != 3) ERR("read");
if (strncmp(buf, "fgh", 3)) ERR("wrong content");
ptr = __collfs_mmap(0, 12, PROT_READ, MAP_PRIVATE, fd, 0);
if (ptr == MAP_FAILED) ERR("mmap failed: %s", strerror(errno));
if (strncmp(ptr+6, "ghijkl", 6)) ERR("wrong content");
ptr2 = __collfs_mmap(0, 20, PROT_READ, MAP_PRIVATE, fd, 0);
if (ptr2 == MAP_FAILED) ERR("mmap failed");
if (strncmp(ptr2+7, "hij", 3)) ERR("wrong content");
err = __collfs_close(fd); if (err) ERR("close");
err = __collfs_munmap(ptr2, 20); if (err) ERR("munmap");
// if (strncmp(ptr+6, "ghijkl", 6)) ERR("wrong content");
err = __collfs_munmap(ptr, 12); if (err) ERR("munmap");
return 0;
}
int foo2(const char *path)
{
int err;
err = collfs_initialize(3, abort);CHK(err);
err = collfs_comm_push(MPI_COMM_WORLD);CHK(err);
foo2_inner(path);
err = collfs_comm_pop();CHK(err);
err = collfs_finalize();CHK(err);
return 0;
}