diff --git a/src/pkg/runtime/malloc.cgo b/src/pkg/runtime/malloc.cgo index 948257973e5..a85c39d83d3 100644 --- a/src/pkg/runtime/malloc.cgo +++ b/src/pkg/runtime/malloc.cgo @@ -27,7 +27,7 @@ mallocgc(uintptr size, uint32 refflag, int32 dogc) void *v; uint32 *ref; - if(gcwaiting && g != m->g0) + if(gcwaiting && g != m->g0 && m->locks == 0) gosched(); if(m->mallocing) throw("malloc/free - deadlock"); diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index 6324b4be4cc..99fa26ad0b2 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -523,6 +523,8 @@ scheduler(void) void gosched(void) { + if(m->locks != 0) + throw("gosched holding locks"); if(g == m->g0) throw("gosched of g0"); if(gosave(&g->sched) == 0)