diff options
| -rw-r--r-- | src/examples/Makefile | 3 | ||||
| -rw-r--r-- | src/examples/pfs.c | 122 | ||||
| -rw-r--r-- | src/examples/pfs.h | 4 | ||||
| -rw-r--r-- | src/examples/pfs_reader.c | 73 | ||||
| -rw-r--r-- | src/examples/pfs_writer.c | 74 |
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); } |
