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.
This commit is contained in:
parent
f97798e710
commit
18b8ae56e8
3 changed files with 12 additions and 6 deletions
|
@ -175,7 +175,7 @@ smalloc(ulong size)
|
|||
if(v != nil)
|
||||
break;
|
||||
if(!waserror()){
|
||||
tsleep(&up->sleep, return0, 0, 100);
|
||||
resrcwait(0);
|
||||
poperror();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -849,7 +849,7 @@ sdbio(Chan* c, int write, char* a, long len, uvlong off)
|
|||
}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 @@ sdrio(SDreq* r, void* a, long n)
|
|||
data = nil;
|
||||
while(n > 0 && (data = sdmalloc(n)) == nil){
|
||||
if(!waserror()){
|
||||
tsleep(&up->sleep, return0, 0, 100);
|
||||
resrcwait("no memory for sdrio");
|
||||
poperror();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -306,6 +306,10 @@ resrcwait(char *reason)
|
|||
|
||||
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 @@ resrcwait(char *reason)
|
|||
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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue