fix pointer-ownership check so that it works
A working check uncovered one of the badly registered statics.
This commit is contained in:
parent
aa1eb065c5
commit
1bfd9987c4
|
@ -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,13 +2922,16 @@ 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
|
||||||
|
&& MASTERGCINFO->signal_fds[i] != (void*) REAPED_SLOT_AVAILABLE
|
||||||
|
&& MASTERGCINFO->signal_fds[i] != (void*) CREATED_BUT_NOT_REGISTERED
|
||||||
|
&& MASTERGCINFO->signal_fds[i] != (void*) SIGNALED_BUT_NOT_REGISTERED) {
|
||||||
if((page = pagemap_find_page(MASTERGCINFO->places_gcs[i]->page_maps, p))) {
|
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);
|
printf("%p is owned by place %i not the current place %i\n", p, i, gc->place_id);
|
||||||
asm("int3");
|
asm("int3");
|
||||||
|
|
Loading…
Reference in New Issue
Block a user