aboutsummaryrefslogtreecommitdiffstats
path: root/src/tests/klaar/pfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/klaar/pfs.c')
-rw-r--r--src/tests/klaar/pfs.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/tests/klaar/pfs.c b/src/tests/klaar/pfs.c
new file mode 100644
index 0000000..fe1c3d7
--- /dev/null
+++ b/src/tests/klaar/pfs.c
@@ -0,0 +1,83 @@
+/* klaar@ida (convert to built-in pintos test)
+
+ Tests that read and write are properly synchronized. Also stresses
+ the filesystem somewhat.
+
+ pfs_reader and pfs_writer are needed child processes.
+*/
+
+#include <syscall.h>
+#include <random.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "../lib.h"
+#include "pfs.h"
+
+static void swap(char* a, char* b)
+{
+ char c = *a;
+ *a = *b;
+ *b = c;
+}
+
+static void start_rw(int rn, int wn)
+{
+ int rpid = -1;
+ int wpid = -1;
+
+ if ( rn > 0 )
+ {
+ rpid = exec ("pfs-reader");
+ msg ("exec(\"pfs-reader\"): %d", rpid);
+ }
+
+ if ( wn > 0 )
+ {
+ int range = '~' - '!' + 1; // ascii 32 - 126
+ char start = '!' + random_ulong () % range;
+ char end = '!' + random_ulong () % range;
+
+ if ( end < start )
+ swap(&start, &end);
+
+ const int CMDSIZE = 64;
+ char cmd[CMDSIZE];
+ snprintf (cmd, CMDSIZE, "pfs-writer %c %c", start, end);
+
+ wpid = exec (cmd);
+ msg ("exec(\"%s\"): %d", cmd, wpid);
+ }
+
+ if ( rn > 0 || wn > 0 )
+ start_rw(rn-1, wn-1);
+
+ if ( rpid != -1 )
+ CHECK( wait( rpid ) != -1, "wait pfs-reader %d", rpid);
+
+ if ( wpid != -1 )
+ CHECK( wait( wpid ) != -1, "wait pfs-writer %d", wpid);
+}
+
+int main (int argc, char *argv[])
+{
+ if ( argc != 3 )
+ fail("usage: pfs START END");
+
+ quiet = true;
+ test_name = argv[0];
+ int num_reader = atoi(argv[1]);
+ int num_writer = atoi(argv[2]);
+
+ msg ("begin");
+
+ CHECK (create ("file.1", BIG), "create \"file.1\"");
+ CHECK (create ("messages", TIMES), "create \"messages\"");
+
+ random_init (0);
+
+ start_rw(num_reader, num_writer);
+
+ msg ("end");
+ return 0;
+}