summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--user/usertests.c60
1 files changed, 58 insertions, 2 deletions
diff --git a/user/usertests.c b/user/usertests.c
index b7c318a..720e3cf 100644
--- a/user/usertests.c
+++ b/user/usertests.c
@@ -17,10 +17,9 @@
// prints "OK".
//
-#define BUFSZ (MAXOPBLOCKS+2)*BSIZE
+#define BUFSZ ((MAXOPBLOCKS+2)*BSIZE)
char buf[BUFSZ];
-char name[3];
// what if you pass ridiculous pointers to system calls
// that read user memory with copyin?
@@ -631,6 +630,7 @@ createtest(char *s)
int i, fd;
enum { N=52 };
+ char name[3];
name[0] = 'a';
name[2] = '\0';
for(i = 0; i < N; i++){
@@ -1728,6 +1728,61 @@ bigwrite(char *s)
}
}
+// concurrent writes to try to provoke deadlock in the virtio disk
+// driver.
+void
+manywrites(char *s)
+{
+ int nchildren = 4;
+
+ for(int ci = 0; ci < nchildren; ci++){
+ int pid = fork();
+ if(pid < 0){
+ printf("fork failed\n");
+ exit(1);
+ }
+
+ if(pid == 0){
+ char name[3];
+ name[0] = 'b';
+ name[1] = 'a' + ci;
+ name[2] = '\0';
+ unlink(name);
+
+ for(int iters = 0; iters < 500000; iters++){
+ for(int i = 0; i < ci+1; i++){
+ int fd = open(name, O_CREATE | O_RDWR);
+ if(fd < 0){
+ printf("%s: cannot create %s\n", s, name);
+ exit(1);
+ }
+ int sz = sizeof(buf);
+ int cc = write(fd, buf, sz);
+ if(cc != sz){
+ printf("%s: write(%d) ret %d\n", s, sz, cc);
+ exit(1);
+ }
+ close(fd);
+ }
+ unlink(name);
+ if((iters % 50) == ci)
+ write(1, ".", 1);
+ }
+
+ unlink(name);
+ exit(0);
+ }
+ }
+
+ for(int ci = 0; ci < nchildren; ci++){
+ int st = 0;
+ wait(&st);
+ if(st != 0)
+ exit(st);
+ }
+ exit(0);
+}
+
void
bigfile(char *s)
{
@@ -2682,6 +2737,7 @@ main(int argc, char *argv[])
void (*f)(char *);
char *s;
} tests[] = {
+ // {manywrites, "manywrites"},
{execout, "execout"},
{copyin, "copyin"},
{copyout, "copyout"},