summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-02-11 17:54:03 -0800
committerRuss Cox <rsc@golang.org>2009-02-11 17:54:03 -0800
commitd89426aacb706dba5b305bd29d5e7f67927e3848 (patch)
tree39eb580e0d3ef2f9f0b7f3cb6047d28b57bda75e
parenta0cfe5c034413449494b330fd538bfdccadb6b2b (diff)
downloadgolang-d89426aacb706dba5b305bd29d5e7f67927e3848.tar.gz
fix gc bug. i think this is tgs's second bug.
i stumbled across it in all.bash. TBR=r OCL=24912 CL=24912
-rw-r--r--src/runtime/malloc.c9
-rw-r--r--src/runtime/mheap.c2
2 files changed, 8 insertions, 3 deletions
diff --git a/src/runtime/malloc.c b/src/runtime/malloc.c
index 163ca8c73..2bee17608 100644
--- a/src/runtime/malloc.c
+++ b/src/runtime/malloc.c
@@ -122,7 +122,7 @@ int32
mlookup(void *v, byte **base, uintptr *size, uint32 **ref)
{
uintptr n, nobj, i;
- byte *p, *ep;
+ byte *p;
MSpan *s;
s = MHeap_LookupMaybe(&mheap, (uintptr)v>>PageShift);
@@ -162,8 +162,11 @@ mlookup(void *v, byte **base, uintptr *size, uint32 **ref)
*size = n;
nobj = (s->npages << PageShift) / (n + RefcountOverhead);
if((byte*)s->gcref < p || (byte*)(s->gcref+nobj) > p+(s->npages<<PageShift)) {
- printf("s->base sizeclass %d %p gcref %p block %D\n",
- s->sizeclass, p, s->gcref, s->npages<<PageShift);
+ printf("odd span state=%d span=%p base=%p sizeclass=%d n=%d size=%d npages=%d\n",
+ s->state, s, p, s->sizeclass, nobj, n, s->npages);
+ printf("s->base sizeclass %d v=%p base=%p gcref=%p blocksize=%D nobj=%d size=%D end=%p end=%p\n",
+ s->sizeclass, v, p, s->gcref, s->npages<<PageShift,
+ nobj, n, s->gcref + nobj, p+(s->npages<<PageShift));
throw("bad gcref");
}
if(ref)
diff --git a/src/runtime/mheap.c b/src/runtime/mheap.c
index 64af8e741..362719434 100644
--- a/src/runtime/mheap.c
+++ b/src/runtime/mheap.c
@@ -228,6 +228,8 @@ MHeap_LookupMaybe(MHeap *h, PageID p)
s = MHeapMap_GetMaybe(&h->map, p);
if(s == nil || p < s->start || p - s->start >= s->npages)
return nil;
+ if(s->state != MSpanInUse)
+ return nil;
return s;
}