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:
cinap_lenrek 2013-05-20 23:55:38 +02:00
parent f97798e710
commit 18b8ae56e8
3 changed files with 12 additions and 6 deletions

View file

@ -175,7 +175,7 @@ smalloc(ulong size)
if(v != nil)
break;
if(!waserror()){
tsleep(&up->sleep, return0, 0, 100);
resrcwait(0);
poperror();
}
}

View file

@ -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();
}
}

View file

@ -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();
}
}