From fab5e7c1de2288e2b9e41f7010ca85f2a641cf63 Mon Sep 17 00:00:00 2001 From: Frans Kaashoek Date: Thu, 4 Jul 2019 08:54:23 -0400 Subject: Make size in stat.h be a uint64 Supporting print long using %l (a bit of cheat) Modify ls to print size using %l We should probably update size in inode too. --- user/ls.c | 2 +- user/printf.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'user') diff --git a/user/ls.c b/user/ls.c index c649c57..3511d87 100644 --- a/user/ls.c +++ b/user/ls.c @@ -43,7 +43,7 @@ ls(char *path) switch(st.type){ case T_FILE: - printf(1, "%s %d %d %d\n", fmtname(path), st.type, st.ino, st.size); + printf(1, "%s %d %d %l\n", fmtname(path), st.type, st.ino, st.size); break; case T_DIR: diff --git a/user/printf.c b/user/printf.c index 0c6b34b..f3b3282 100644 --- a/user/printf.c +++ b/user/printf.c @@ -68,6 +68,8 @@ printf(int fd, const char *fmt, ...) } else if(state == '%'){ if(c == 'd'){ printint(fd, va_arg(ap, int), 10, 1); + } else if(c == 'l') { + printint(fd, va_arg(ap, uint64), 10, 0); } else if(c == 'x') { printint(fd, va_arg(ap, int), 16, 0); } else if(c == 'p') { -- cgit v1.2.3 From be88befed702f7bcbf65212a9dcf9456a7bd2ae1 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Fri, 5 Jul 2019 11:44:51 -0400 Subject: two exit/exit tests --- user/usertests.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 2 deletions(-) (limited to 'user') diff --git a/user/usertests.c b/user/usertests.c index ef70bfb..199346c 100644 --- a/user/usertests.c +++ b/user/usertests.c @@ -417,16 +417,18 @@ exitwait(void) { int i, pid; + printf(1, "exitwait test\n"); + for(i = 0; i < 100; i++){ pid = fork(); if(pid < 0){ printf(1, "fork failed\n"); - return; + exit(); } if(pid){ if(wait() != pid){ printf(1, "wait wrong pid\n"); - return; + exit(); } } else { exit(); @@ -435,6 +437,75 @@ exitwait(void) printf(1, "exitwait ok\n"); } +// try to find races in the reparenting +// code that handles a parent exiting +// when it still has live children. +void +reparent(void) +{ + int master_pid = getpid(); + + printf(1, "reparent test\n"); + + for(int i = 0; i < 100; i++){ + int pid = fork(); + if(pid < 0){ + printf(1, "fork failed\n"); + exit(); + } + if(pid){ + if(wait() != pid){ + printf(1, "wait wrong pid\n"); + exit(); + } + } else { + int pid2 = fork(); + if(pid2 < 0){ + printf(1, "fork failed\n"); + kill(master_pid); + exit(); + } + if(pid2 == 0){ + exit(); + } else { + exit(); + } + } + } + printf(1, "reparent ok\n"); +} + +// what if two children exit() at the same time? +void +twochildren(void) +{ + printf(1, "twochildren test\n"); + + for(int i = 0; i < 1000; i++){ + int pid1 = fork(); + if(pid1 < 0){ + printf(1, "fork failed\n"); + exit(); + } + if(pid1 == 0){ + exit(); + } else { + int pid2 = fork(); + if(pid2 < 0){ + printf(1, "fork failed\n"); + exit(); + } + if(pid2 == 0){ + exit(); + } else { + wait(); + wait(); + } + } + } + printf(1, "twochildren ok\n"); +} + void mem(void) { @@ -1751,6 +1822,9 @@ main(int argc, char *argv[]) } close(open("usertests.ran", O_CREATE)); + reparent(); + twochildren(); + argptest(); createdelete(); linkunlink(); -- cgit v1.2.3 From 62313be582a5abd3a114eec3c9f5770ea37ef766 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Sun, 7 Jul 2019 06:39:31 -0400 Subject: another fork test --- user/usertests.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'user') diff --git a/user/usertests.c b/user/usertests.c index 199346c..9d46b1a 100644 --- a/user/usertests.c +++ b/user/usertests.c @@ -506,6 +506,40 @@ twochildren(void) printf(1, "twochildren ok\n"); } +void +forkforkfork(void) +{ + printf(1, "forkforkfork test\n"); + + unlink("stopforking"); + + int pid = fork(); + if(pid < 0){ + printf(1, "fork failed"); + exit(); + } + if(pid == 0){ + while(1){ + int fd = open("stopforking", 0); + if(fd >= 0){ + exit(); + } + if(fork() < 0){ + close(open("stopforking", O_CREATE|O_RDWR)); + } + } + + exit(); + } + + sleep(2); + close(open("stopforking", O_CREATE|O_RDWR)); + wait(); + sleep(1); + + printf(1, "forkforkfork ok\n"); +} + void mem(void) { @@ -1824,6 +1858,7 @@ main(int argc, char *argv[]) reparent(); twochildren(); + forkforkfork(); argptest(); createdelete(); -- cgit v1.2.3