ref: edf1614309e7fd4a7c5b56912bb250d487a4172e
parent: 3354a016d212b2fb591dbc1f19b67a0c0036a4e6
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Mon May 20 19:55:38 EDT 2013
use resrcwait() when waiting for memory to become available use resrcwait() when waiting for memory to become available. randomize the sleep time and properly restore old process status in case tsleep() gets interrupted.
--- a/sys/src/9/port/alloc.c
+++ b/sys/src/9/port/alloc.c
@@ -175,7 +175,7 @@
if(v != nil)
break;
if(!waserror()){- tsleep(&up->sleep, return0, 0, 100);
+ resrcwait(0);
poperror();
}
}
--- a/sys/src/9/port/devsd.c
+++ b/sys/src/9/port/devsd.c
@@ -849,7 +849,7 @@
}else{ while((b = sdmalloc(nb*unit->secsize)) == nil){ if(!waserror()){- tsleep(&up->sleep, return0, 0, 100);
+ resrcwait("no memory for sdbio");poperror();
}
}
@@ -934,7 +934,7 @@
data = nil;
while(n > 0 && (data = sdmalloc(n)) == nil){ if(!waserror()){- tsleep(&up->sleep, return0, 0, 100);
+ resrcwait("no memory for sdrio");poperror();
}
}
--- a/sys/src/9/port/pgrp.c
+++ b/sys/src/9/port/pgrp.c
@@ -306,6 +306,10 @@
p = up->psstate;
if(reason) {+ if(waserror()){+ up->psstate = p;
+ nexterror();
+ }
up->psstate = reason;
now = seconds();
/* don't tie up the console with complaints */
@@ -314,7 +318,9 @@
print("%s\n", reason);}
}
-
- tsleep(&up->sleep, return0, 0, 300);
- up->psstate = p;
+ tsleep(&up->sleep, return0, 0, 100+nrand(200));
+ if(reason) {+ up->psstate = p;
+ poperror();
+ }
}
--
⑨