ref: 8a3a36fc056950f2d5aa3bc6b9587fc5e2984ca2
parent: 58201a67c1cfceda2993979852a367b213abc0ee
author: cinap_lenrek <[email protected]>
date: Mon May 20 22:29:46 EDT 2013
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.
--- a/sys/src/9/port/allocb.c
+++ b/sys/src/9/port/allocb.c
@@ -64,10 +64,16 @@
*/
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));