diff options
author | rtm <rtm> | 2006-07-15 12:03:57 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-07-15 12:03:57 +0000 |
commit | 46bbd72f3eeaff9386b2a90af88f3d46b458a0e8 (patch) | |
tree | 31ca93c160a10c50948329b30d27475aa6b38313 /usertests.c | |
parent | d9872ffa951291fcc3f7a92c0d235b86435c5714 (diff) | |
download | xv6-labs-46bbd72f3eeaff9386b2a90af88f3d46b458a0e8.tar.gz xv6-labs-46bbd72f3eeaff9386b2a90af88f3d46b458a0e8.tar.bz2 xv6-labs-46bbd72f3eeaff9386b2a90af88f3d46b458a0e8.zip |
no more recursive locks
wakeup1() assumes you hold proc_table_lock
sleep(chan, lock) provides atomic sleep-and-release to wait for condition
ugly code in swtch/scheduler to implement new sleep
fix lots of bugs in pipes, wait, and exit
fix bugs if timer interrupt goes off in schedule()
console locks per line, not per byte
Diffstat (limited to 'usertests.c')
-rw-r--r-- | usertests.c | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/usertests.c b/usertests.c index 2f688ca..e277839 100644 --- a/usertests.c +++ b/usertests.c @@ -16,7 +16,7 @@ pipe1() for(i = 0; i < 1033; i++) buf[i] = seq++; if(write(fds[1], buf, 1033) != 1033){ - puts("pipe1 oops 1\n"); + panic("pipe1 oops 1\n"); exit(1); } } @@ -31,7 +31,7 @@ pipe1() break; for(i = 0; i < n; i++){ if((buf[i] & 0xff) != (seq++ & 0xff)){ - puts("pipe1 oops 2\n"); + panic("pipe1 oops 2\n"); return; } } @@ -41,8 +41,9 @@ pipe1() cc = sizeof(buf); } if(total != 5 * 1033) - puts("pipe1 oops 3\n"); + panic("pipe1 oops 3\n"); close(fds[0]); + wait(); } puts("pipe1 ok\n"); } @@ -69,7 +70,7 @@ preempt() if(pid3 == 0){ close(pfds[0]); if(write(pfds[1], "x", 1) != 1) - puts("preempt write error"); + panic("preempt write error"); close(pfds[1]); while(1) ; @@ -77,7 +78,7 @@ preempt() close(pfds[1]); if(read(pfds[0], buf, sizeof(buf)) != 1){ - puts("preempt read error"); + panic("preempt read error"); return; } close(pfds[0]); @@ -90,12 +91,37 @@ preempt() puts("preempt ok\n"); } +// try to find any races between exit and wait +void +exitwait() +{ + int i, pid; + + for(i = 0; i < 100; i++){ + pid = fork(); + if(pid < 0){ + panic("fork failed\n"); + return; + } + if(pid){ + if(wait() != pid){ + panic("wait wrong pid\n"); + return; + } + } else { + exit(0); + } + } + puts("exitwait ok\n"); +} + main() { puts("usertests starting\n"); + pipe1(); - //preempt(); + preempt(); + exitwait(); - while(1) - ; + panic("usertests finished successfuly"); } |