]> Cypherpunks repositories - gostls13.git/commitdiff
fix gc bug. i think this is tgs's second bug.
authorRuss Cox <rsc@golang.org>
Thu, 12 Feb 2009 01:54:03 +0000 (17:54 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 12 Feb 2009 01:54:03 +0000 (17:54 -0800)
i stumbled across it in all.bash.

TBR=r
OCL=24912
CL=24912

src/runtime/malloc.c
src/runtime/mheap.c

index 163ca8c73413213a7835dfa4e27eaf131f5a8a55..2bee17608704ec0fb507fd6802ba08e44582302e 100644 (file)
@@ -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)
index 64af8e741a9f103bf92c30488966f29cdf24677f..362719434c554c671c2995ddc1a7a0b9e920c957 100644 (file)
@@ -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;
 }