fix pointer-ownership check so that it works

A working check uncovered one of the badly registered statics.
This commit is contained in:
Matthew Flatt 2011-09-16 15:00:00 -06:00
parent aa1eb065c5
commit 1bfd9987c4

View File

@ -511,10 +511,10 @@ inline static mpage *pagemap_find_page(PageMap page_maps1, const void *p) {
page_maps3 = page_maps2[PAGEMAP64_LEVEL2_BITS(p)]; page_maps3 = page_maps2[PAGEMAP64_LEVEL2_BITS(p)];
if (!page_maps3) goto done; if (!page_maps3) goto done;
result = page_maps3[PAGEMAP64_LEVEL3_BITS(p)]; result = page_maps3[PAGEMAP64_LEVEL3_BITS(p)];
done:
#else #else
result = page_maps1[PAGEMAP32_BITS(p)]; result = page_maps1[PAGEMAP32_BITS(p)];
#endif #endif
done:
mzrt_mutex_unlock(gc->pagetable_lock); mzrt_mutex_unlock(gc->pagetable_lock);
return result; return result;
#else #else
@ -2523,7 +2523,7 @@ static intptr_t NewGCMasterInfo_find_free_id() {
MASTERGCINFO->size++; MASTERGCINFO->size++;
MASTERGCINFO->alive++; MASTERGCINFO->alive++;
MASTERGCINFO->signal_fds = realloc(MASTERGCINFO->signal_fds, sizeof(void*) * MASTERGCINFO->size); MASTERGCINFO->signal_fds = realloc(MASTERGCINFO->signal_fds, sizeof(void*) * MASTERGCINFO->size);
#ifdef POINTER_OWERSHIP_CHECK #ifdef POINTER_OWNERSHIP_CHECK
MASTERGCINFO->places_gcs= realloc(MASTERGCINFO->places_gcs, sizeof(NewGC*) * MASTERGCINFO->size); MASTERGCINFO->places_gcs= realloc(MASTERGCINFO->places_gcs, sizeof(NewGC*) * MASTERGCINFO->size);
#endif #endif
return MASTERGCINFO->size - 1; return MASTERGCINFO->size - 1;
@ -2701,7 +2701,7 @@ void GC_destruct_child_gc() {
waiting = MASTERGC->major_places_gc; waiting = MASTERGC->major_places_gc;
if (!waiting) { if (!waiting) {
MASTERGCINFO->signal_fds[gc->place_id] = (void *) REAPED_SLOT_AVAILABLE; MASTERGCINFO->signal_fds[gc->place_id] = (void *) REAPED_SLOT_AVAILABLE;
#ifdef POINTER_OWERSHIP_CHECK #ifdef POINTER_OWNERSHIP_CHECK
MASTERGCINFO->places_gcs[gc->place_id] = NULL; MASTERGCINFO->places_gcs[gc->place_id] = NULL;
#endif #endif
gc->place_id = -1; gc->place_id = -1;
@ -2922,21 +2922,24 @@ void GC_mark2(const void *const_p, struct NewGC *gc)
if (!MASTERGC || !MASTERGC->major_places_gc || !(page = pagemap_find_page(MASTERGC->page_maps, p))) if (!MASTERGC || !MASTERGC->major_places_gc || !(page = pagemap_find_page(MASTERGC->page_maps, p)))
#endif #endif
{ {
#ifdef POINTER_OWERSHIP_CHECK #ifdef POINTER_OWNERSHIP_CHECK
mzrt_rwlock_wrlock(MASTERGCINFO->cangc); mzrt_rwlock_wrlock(MASTERGCINFO->cangc);
{ {
int i; int i;
int size = MASTERGCINFO->size; int size = MASTERGCINFO->size;
for (i = 0; i < size; i++) { for (i = 1; i < size; i++) {
if (gc->place_id != i && MASTERGCINFO->signal_fds[i] != (void*) REAPED_SLOT_AVAILABLE) { if (gc->place_id != i
if((page = pagemap_find_page(MASTERGCINFO->places_gcs[i]->page_maps, p))) { && MASTERGCINFO->signal_fds[i] != (void*) REAPED_SLOT_AVAILABLE
printf("%p is owned by place %i not the current place %i\n", p, i, gc->place_id); && MASTERGCINFO->signal_fds[i] != (void*) CREATED_BUT_NOT_REGISTERED
asm("int3"); && MASTERGCINFO->signal_fds[i] != (void*) SIGNALED_BUT_NOT_REGISTERED) {
if((page = pagemap_find_page(MASTERGCINFO->places_gcs[i]->page_maps, p))) {
printf("%p is owned by place %i not the current place %i\n", p, i, gc->place_id);
asm("int3");
}
}
} }
} }
} mzrt_rwlock_unlock(MASTERGCINFO->cangc);
}
mzrt_rwlock_unlock(MASTERGCINFO->cangc);
#endif #endif
GCDEBUG((DEBUGOUTF,"Not marking %p (no page)\n",p)); GCDEBUG((DEBUGOUTF,"Not marking %p (no page)\n",p));
return; return;