diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-05-21 02:29:46 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-05-21 02:29:46 +0200 |
commit | 8a3a36fc056950f2d5aa3bc6b9587fc5e2984ca2 (patch) | |
tree | 9a182a633702b199086970a2190bd59fae90271c /sys/src/9/port/allocb.c | |
parent | 58201a67c1cfceda2993979852a367b213abc0ee (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.c | 14 |
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)); |