123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #include <u.h>
- #include <lib9.h>
- int32_t nprocs = 32;
- int32_t nloops = 10000;
- int32_t x = 1;
- int32_t incr;
- void
- tsemloop(void)
- {
- int i;
- i = 0;
- while(i < nloops){
- if(tsemacquire(&x, 10)){
- if((i % 1000) == 0)
- sleep(10);
- incr++;
- i++;
- sys_semrelease(&x, 1);
- } else {
- //print("pid %d timeout\n", getpid());
- }
- }
- exits("PASS");
- }
- void
- semloop(void)
- {
- int i;
- i = 0;
- while(i < nloops){
- if(sys_semacquire(&x, 1)){
- incr++;
- i++;
- sys_semrelease(&x, 1);
- } else {
- sysfatal("semacquire failed");
- }
- }
- }
- void
- main(void)
- {
- int i;
- incr = 0;
- for(i = 0; i < nprocs; i++){
- switch(sys_rfork(RFMEM|RFPROC)){
- case -1:
- sysfatal("sys_rfork");
- case 0:
- tsemloop();
- exits("PASS");
- default:
- break;
- }
- }
- for(i = 0; i < nprocs; i++)
- waitpid();
- print("tsemloop incr %d\n", incr);
- if(incr != nprocs*nloops){
- print("FAIL\n");
- exits("FAIL");
- }
- incr = 0;
- for(i = 0; i < nprocs; i++){
- switch(sys_rfork(RFMEM|RFPROC)){
- case -1:
- sysfatal("sys_rfork");
- case 0:
- semloop();
- exits("PASS");
- default:
- break;
- }
- }
- for(i = 0; i < nprocs; i++)
- waitpid();
- print("semloop incr %d\n", incr);
- if(incr != nprocs*nloops){
- print("FAIL\n");
- exits("FAIL");
- }
- incr = 0;
- for(i = 0; i < nprocs; i++){
- switch(sys_rfork(RFMEM|RFPROC)){
- case -1:
- sysfatal("sys_rfork");
- case 0:
- if((i&1) == 0)
- semloop();
- else
- tsemloop();
- exits("PASS");
- default:
- break;
- }
- }
- for(i = 0; i < nprocs; i++)
- waitpid();
- print("mixed incr %d\n", incr);
- if(incr != nprocs*nloops){
- print("FAIL\n");
- exits("FAIL");
- }
- print("PASS\n");
- exits("PASS");
- }
|