Commit 3e029875 authored by Russ Cox's avatar Russ Cox

tgs's gc bug.

R=r
DELTA=10  (7 added, 0 deleted, 3 changed)
OCL=24577
CL=24577
parent 39d05ae8
...@@ -121,8 +121,8 @@ free(void *v) ...@@ -121,8 +121,8 @@ free(void *v)
int32 int32
mlookup(void *v, byte **base, uintptr *size, uint32 **ref) mlookup(void *v, byte **base, uintptr *size, uint32 **ref)
{ {
uintptr n, i; uintptr n, nobj, i;
byte *p; byte *p, *ep;
MSpan *s; MSpan *s;
s = MHeap_LookupMaybe(&mheap, (uintptr)v>>PageShift); s = MHeap_LookupMaybe(&mheap, (uintptr)v>>PageShift);
...@@ -148,13 +148,20 @@ mlookup(void *v, byte **base, uintptr *size, uint32 **ref) ...@@ -148,13 +148,20 @@ mlookup(void *v, byte **base, uintptr *size, uint32 **ref)
return 1; return 1;
} }
if((byte*)v >= (byte*)s->gcref) {
// pointers into the gc ref counts
// do not count as pointers.
return 0;
}
n = class_to_size[s->sizeclass]; n = class_to_size[s->sizeclass];
i = ((byte*)v - p)/n; i = ((byte*)v - p)/n;
if(base) if(base)
*base = p + i*n; *base = p + i*n;
if(size) if(size)
*size = n; *size = n;
if((byte*)s->gcref < p || (byte*)s->gcref >= p+(s->npages<<PageShift)) { 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", printf("s->base sizeclass %d %p gcref %p block %D\n",
s->sizeclass, p, s->gcref, s->npages<<PageShift); s->sizeclass, p, s->gcref, s->npages<<PageShift);
throw("bad gcref"); throw("bad gcref");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment