summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/port/allocb.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/src/9/port/allocb.c b/sys/src/9/port/allocb.c
index c6989452b..97176d76d 100644
--- a/sys/src/9/port/allocb.c
+++ b/sys/src/9/port/allocb.c
@@ -64,10 +64,16 @@ allocb(int size)
*/
if(up == nil)
panic("allocb without up: %#p", getcallerpc(&size));
- if((b = _allocb(size)) == nil){
- xsummary();
- mallocsummary();
- panic("allocb: no memory for %d bytes", size);
+ while((b = _allocb(size)) == nil){
+ if(up->nlocks.ref || m->ilockdepth || !islo()){
+ xsummary();
+ mallocsummary();
+ panic("allocb: no memory for %d bytes", size);
+ }
+ if(!waserror()){
+ resrcwait("no memory for allocb");
+ poperror();
+ }
}
setmalloctag(b, getcallerpc(&size));