summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-01-12 10:03:02 -0800
committerRuss Cox <rsc@golang.org>2010-01-12 10:03:02 -0800
commitdd59eab8850ac380a2e85cb0d1613c6b7eecce54 (patch)
tree762a957e90aaf79de9c529a3f2018f97573d1a3d
parent71156986095f0bebbc900f0eaf0a1da3724579e6 (diff)
downloadgolang-dd59eab8850ac380a2e85cb0d1613c6b7eecce54.tar.gz
runtime: fix bug in preemption checks; was causing "lock count" panics
R=r CC=golang-dev http://codereview.appspot.com/186078
-rw-r--r--src/pkg/runtime/malloc.cgo2
-rw-r--r--src/pkg/runtime/proc.c2
2 files changed, 3 insertions, 1 deletions
diff --git a/src/pkg/runtime/malloc.cgo b/src/pkg/runtime/malloc.cgo
index 948257973..a85c39d83 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 6324b4be4..99fa26ad0 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)