diff options
author | Robert Morris <[email protected]> | 2020-08-19 12:35:14 -0400 |
---|---|---|
committer | Frans Kaashoek <[email protected]> | 2020-08-21 11:00:45 -0400 |
commit | 5860dcd07d9a9cba5c7ebf7488636d131015316d (patch) | |
tree | 6e6581500c59d692267bdc1980dcd21f123ee6fb /user/usertests.c | |
parent | d4d487731ad760376999130fc2ad520c3dd6166c (diff) | |
download | xv6-labs-5860dcd07d9a9cba5c7ebf7488636d131015316d.tar.gz xv6-labs-5860dcd07d9a9cba5c7ebf7488636d131015316d.tar.bz2 xv6-labs-5860dcd07d9a9cba5c7ebf7488636d131015316d.zip |
usertest for exec() out of memory recovery
and fix a few exec() bugs
Diffstat (limited to 'user/usertests.c')
-rw-r--r-- | user/usertests.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/user/usertests.c b/user/usertests.c index cc88555..acdba0f 100644 --- a/user/usertests.c +++ b/user/usertests.c @@ -2452,6 +2452,42 @@ badarg(char *s) exit(0); } +// test the exec() code that cleans up if it runs out +// of memory. it's really a test that such a condition +// doesn't cause a panic. +void +execout(char *s) +{ + for(int avail = 0; avail < 15; avail++){ + int pid = fork(); + if(pid < 0){ + printf("fork failed\n"); + exit(1); + } else if(pid == 0){ + // allocate all of memory. + while(1){ + uint64 a = (uint64) sbrk(4096); + if(a == 0xffffffffffffffffLL) + break; + } + + // free a few pages, in order to let exec() make some + // progress. + for(int i = 0; i < avail; i++) + sbrk(-4096); + + close(1); + char *args[] = { "echo", "x", 0 }; + exec("echo", args); + exit(0); + } else { + wait((int*)0); + } + } + + exit(0); +} + // // use sbrk() to count how many free physical memory pages there are. // @@ -2520,6 +2556,7 @@ main(int argc, char *argv[]) void (*f)(char *); char *s; } tests[] = { + {execout, "execout"}, {copyin, "copyin"}, {copyout, "copyout"}, {copyinstr1, "copyinstr1"}, |