summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/examples/Makefile3
-rw-r--r--src/examples/pfs.c122
-rw-r--r--src/examples/pfs.h4
-rw-r--r--src/examples/pfs_reader.c73
-rw-r--r--src/examples/pfs_writer.c74
5 files changed, 190 insertions, 86 deletions
diff --git a/src/examples/Makefile b/src/examples/Makefile
index 986e492..5517532 100644
--- a/src/examples/Makefile
+++ b/src/examples/Makefile
@@ -4,7 +4,7 @@ SRCDIR = ..
# To add a new test, put its name on the PROGS list
# and then add a name_SRC line that lists its source files.
PROGS = cat cmp cp echo halt hex-dump ls mcat mcp mkdir pwd rm shell \
- bubsort insult lineup matmult recursor \
+ bubsort insult lineup matmult recursor recursor_ng \
sumargv lab2test lab1test lab1test2 pfs pfs_reader pfs_writer dummy longrun \
child parent create-bad printf
@@ -34,6 +34,7 @@ insult_SRC = insult.c
lineup_SRC = lineup.c
ls_SRC = ls.c
recursor_SRC = recursor.c
+recursor_ng_SRC = recursor_ng.c
rm_SRC = rm.c
# Should work in project 3; also in project 4 if VM is included.
diff --git a/src/examples/pfs.c b/src/examples/pfs.c
index 0d9cd52..a42ddfc 100644
--- a/src/examples/pfs.c
+++ b/src/examples/pfs.c
@@ -1,22 +1,110 @@
#include "syscall.h"
+#include "pfs.h"
+
+#include <random.h>
+#include <stdio.h>
+#include <string.h>
int main(void)
{
- int i;
- int pid[5];
-
- create("file.1", 50000);
- create("messages", 5000);
-
- pid[0] = exec("pfs_writer a z");
- pid[1] = exec("pfs_writer A Z");
- pid[2] = exec("pfs_reader");
- pid[3] = exec("pfs_reader");
- pid[4] = exec("pfs_reader");
-
- for (i = 0; i < 5; i++)
- {
- wait(pid[i]);
- }
- exit(0);
+ 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);
}
diff --git a/src/examples/pfs.h b/src/examples/pfs.h
index 2ba7fce..dc13303 100644
--- a/src/examples/pfs.h
+++ b/src/examples/pfs.h
@@ -1,2 +1,4 @@
-#define BIG 3000
+#define BIG 100
#define TIMES 500
+#define N_PROC 10
+#define R_BYTES 100
diff --git a/src/examples/pfs_reader.c b/src/examples/pfs_reader.c
index 583583a..546b1eb 100644
--- a/src/examples/pfs_reader.c
+++ b/src/examples/pfs_reader.c
@@ -10,39 +10,42 @@ char buffer[BIG];
int main(void)
{
- int bytes, i, j, inconsistency;
- int id, messages;
-
- messages = open("messages");
-
- for (i = 0; i < TIMES; ++i)
- {
- id = open("file.1");
- bytes = read(id, buffer, BIG);
- close(id);
-
- if (bytes != BIG)
- {
- write(messages, "Buffer not filled!\n", 19);
- continue;
- }
- /* now check for consistency */
- for (j = 1, inconsistency = 0; j < BIG; ++j)
- {
- if (buffer[0] != buffer[j])
- {
- /* Ooops, inconsistency */
- write(messages, "INCONSISTENCY.", 14);
- printf("INCONSISTENCY\n");
- inconsistency = 1;
- break; /* no need to check further */
- }
- }
- if (!inconsistency)
- {
- write(messages, "cool\n", 5);
- }
- }
- close(messages);
- exit(0);
+ int bytes, j;
+ int id;
+ int fsize;
+
+ printf("-\n");
+ id = open("file.1");
+
+ fsize = filesize(id);
+ if (fsize < BIG * TIMES) {
+ printf("Invalid filesize\n");
+ close(id);
+ exit(-1);
+ }
+ while (tell(id) <= (fsize-BIG))
+ {
+ bytes = read(id, buffer, BIG);
+
+ if (bytes != BIG)
+ {
+ printf("Buffer not filled, read %d\n", bytes);
+ close(id);
+ exit(-1);
+ }
+ /* now check for consistency */
+ for (j = 1; j < BIG; ++j)
+ {
+ if (buffer[0] != buffer[j])
+ {
+ /* Ooops, inconsistency */
+ printf("INCONSISTENCY\n");
+ close(id);
+ exit(-1);
+ }
+ }
+ }
+ printf("*-\n");
+ close(id);
+ exit(0);
}
diff --git a/src/examples/pfs_writer.c b/src/examples/pfs_writer.c
index 0ebd772..80f0826 100644
--- a/src/examples/pfs_writer.c
+++ b/src/examples/pfs_writer.c
@@ -6,42 +6,52 @@
#include <syscall.h>
#include <stdio.h>
#include <string.h>
+#include <random.h>
+
#include "pfs.h"
+
char buffer[BIG];
int main(int argc, char* argv[])
{
- int i,j;
- char c;
- int id;
- int write_count;
- char start;
- char end;
-
- if (argc != 3 || strlen(argv[1]) != 1 || strlen(argv[2]) != 1)
- exit(1);
-
- start = argv[1][0];
- end = argv[2][0];
-
- for (i = 0; i < TIMES / (end - start + 1) + 1; ++i)
- {
- for (c = start; c <= end; ++c)
- {
- for (j = 0; j < BIG; j++)
- buffer[j] = c;
-
- id = open("file.1");
- write_count = write(id, buffer, BIG);
-
- if ( write_count != BIG )
- {
- printf("TEST ERROR: write() wrote only %d bytes out of %d bytes\n",
- write_count, BIG);
- }
- close(id);
- }
- }
- exit(0);
+ int i;
+ char c;
+ int id;
+ int write_count;
+ char start;
+ char end;
+
+ random_init((int)argv[3][0]);
+ printf("+\n");
+
+ if (argc != 4 || strlen(argv[1]) != 1 || strlen(argv[2]) != 1)
+ exit(1);
+
+ start = argv[1][0];
+ end = argv[2][0];
+
+ for (i = 0; i < TIMES / (end - start + 1) + 1; ++i)
+ {
+ for (c = start; c <= end; ++c)
+ {
+ memset(buffer, (int)c, BIG);
+
+ id = open("file.1");
+
+ seek(id,(random_ulong() % (TIMES-1)) * BIG);
+ write_count = write(id, buffer, BIG);
+
+ if ( write_count != BIG )
+ {
+ printf("TEST ERROR: write() wrote only %d bytes out of %d bytes\n",
+ write_count, BIG);
+ close(id);
+ exit(-1);
+ }
+ close(id);
+ }
+ }
+ printf("*+\n");
+ exit(0);
}