The code was already careful not to use malloc/free
for stack growth during calls to malloc.
Avoid them during calls to free too.
R=r
DELTA=9 (7 added, 0 deleted, 2 changed)
OCL=29606
CL=29610
uint32 *ref;
if(m->mallocing)
- throw("malloc - deadlock");
+ throw("malloc/free - deadlock");
m->mallocing = 1;
if(size == 0)
if(v == nil)
return;
+ if(m->mallocing)
+ throw("malloc/free - deadlock");
+ m->mallocing = 1;
+
mlookup(v, nil, nil, &ref);
*ref = RefFree;
mstats.alloc -= s->npages<<PageShift;
sys_memclr(v, s->npages<<PageShift);
MHeap_Free(&mheap, s);
- return;
+ goto out;
}
MHeapMapCache_SET(&mheap.mapcache, page, sizeclass);
}
sys_memclr(v, size);
mstats.alloc -= size;
MCache_Free(c, v, sizeclass, size);
+
+out:
+ m->mallocing = 0;
}
int32