summaryrefslogtreecommitdiff
path: root/sys/src/9/port/allocb.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-05-21 02:29:46 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-05-21 02:29:46 +0200
commit8a3a36fc056950f2d5aa3bc6b9587fc5e2984ca2 (patch)
tree9a182a633702b199086970a2190bd59fae90271c /sys/src/9/port/allocb.c
parent58201a67c1cfceda2993979852a367b213abc0ee (diff)
kernel: make allocb() wait instead of panic() when possible
as long as our process doesnt hold any locks or ilocks, we can try to wait for the memory to become available instead of panicing.
Diffstat (limited to 'sys/src/9/port/allocb.c')
-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));