summaryrefslogtreecommitdiffstats
path: root/src/examples/pfs.c
blob: a42ddfce66f8505dd06702c3f8b0a1f78ec6b535 (plain) (blame)
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
#include "syscall.h"
#include "pfs.h"

#include <random.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
	int i;
	int pid[N_PROC];
	char seed[R_BYTES];
	int ret;
	int len;
	char pfswriter[50] = "pfs_writer a z ";
	int fail = 0;

	ret = open("random");
	if (!ret) {
		printf("Failed to open random.\n");
		exit(-1);
	}

	read(ret, &seed[0], R_BYTES);
	close(ret);

	random_init((int)seed[0]);
	len = strlen(pfswriter);

	ret = create("file.1", BIG * TIMES);

	if (!ret)  {
		printf("Failed to create file.1\n");
		exit(-1);
	}

	for (i = 0; i < N_PROC; i++) {
		if(random_ulong() % 2 == 0)	 {
			pfswriter[len] = seed[i];
			pfswriter[len + 1] = 0;
			pid[i] = exec(pfswriter);
			if (pid[i] < 0) {
				printf("ERROR: Child creation returned %d\n", pid[i]);
				fail = 1;
			}
		}
		else  {
			pid[i] = exec("pfs_reader");
			if (pid[i] < 0) {
				printf("ERROR: Child creation returned %d\n", pid[i]);
				fail = 1;
			}
		}
	}

	for (i = 0; i < N_PROC; i++)
	{
		ret = wait(pid[i]);
		if (ret < 0) {
			printf("ERROR: Child wait returned %d\n", ret);
			fail = 1;
		}
	}


	printf("Testing concurrent writers\n");

	for (i =0; i < N_PROC; i++) {
		pfswriter[len] = seed[i];
		pfswriter[len + 1] = 0;
		pid[i] = exec(pfswriter);
		if (pid[i] < 0) {
			printf("ERROR: Child creation returned %d\n", pid[i]);
			fail = 1;
		}
	}

	for (i = 0; i < N_PROC; i++)
	{
		ret = wait(pid[i]);
		if (ret < 0) {
			printf("ERROR: Child wait returned %d\n", ret);
			fail = 1;
		}
	}

	printf("Testing concurrent readers\n");

	for (i =0; i < N_PROC; i++) {
		pid[i] = exec("pfs_reader");
		if (pid[i] < 0) {
			printf("ERROR: Child creation returned %d\n", pid[i]);
			fail = 1;
		}
	}

	for (i = 0; i < N_PROC; i++)
	{
		ret = wait(pid[i]);
		if (ret < 0) {
			printf("ERROR: Child wait returned %d\n", ret);
			fail = 1;
		}
	}

	if (fail)
		printf("Test failed!\n");

	exit(0);
}