GC: fix block_cache assumptions
Correct a mismatch for an internal API.
This commit is contained in:
parent
2616b06570
commit
166d6fd8a3
|
@ -434,14 +434,19 @@ static void block_cache_protect_one_page(BlockCache* bc, void *p, size_t len, in
|
|||
GC_ASSERT(pos >= 0);
|
||||
GC_ASSERT(pos < (b->size >> LOG_APAGE_SIZE));
|
||||
GC_ASSERT(BD_MAP_GET_BIT(b->alloc_map, pos));
|
||||
/* Since a queued mprotect affects more pages than the client can be sure of,
|
||||
we have to accomodate redundant requests. */
|
||||
if (writeable) {
|
||||
GC_ASSERT(BD_MAP_GET_BIT(b->protect_map, pos));
|
||||
BD_MAP_UNSET_BIT(b->protect_map, pos);
|
||||
if (BD_MAP_GET_BIT(b->protect_map, pos)) {
|
||||
BD_MAP_UNSET_BIT(b->protect_map, pos);
|
||||
os_protect_pages(p, len, writeable);
|
||||
}
|
||||
} else {
|
||||
GC_ASSERT(!BD_MAP_GET_BIT(b->protect_map, pos));
|
||||
BD_MAP_SET_BIT(b->protect_map, pos);
|
||||
if (!BD_MAP_GET_BIT(b->protect_map, pos)) {
|
||||
BD_MAP_SET_BIT(b->protect_map, pos);
|
||||
os_protect_pages(p, len, writeable);
|
||||
}
|
||||
}
|
||||
os_protect_pages(p, len, writeable);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -4225,7 +4225,7 @@ static void mark_backpointers(NewGC *gc)
|
|||
GC_ASSERT(work->back_pointers);
|
||||
|
||||
if (work->mprotected) {
|
||||
/* expected only if QUEUED_MPROTECT_IS_PROMISCUOUS && AGE_GEN_0_TO_GEN_HALF(gc) */
|
||||
/* expected only if QUEUED_MPROTECT_INFECTS_XXX && AGE_GEN_0_TO_GEN_HALF(gc) */
|
||||
work->mprotected = 0;
|
||||
mmu_write_unprotect_page(gc->mmu, work->addr, real_page_size(work), page_mmu_type(work), &work->mmu_src_block);
|
||||
}
|
||||
|
@ -4909,7 +4909,7 @@ static void protect_old_pages(NewGC *gc)
|
|||
if (!page->mprotected && !page->back_pointers) {
|
||||
page->mprotected = 1;
|
||||
mmu_queue_write_protect_range(mmu, page->addr, real_page_size(page), page_mmu_type(page), &page->mmu_src_block);
|
||||
} else if (QUEUED_MPROTECT_IS_PROMISCUOUS)
|
||||
} else if (QUEUED_MPROTECT_INFECTS_SMALL)
|
||||
page->mprotected = 1;
|
||||
}
|
||||
}
|
||||
|
@ -4921,7 +4921,7 @@ static void protect_old_pages(NewGC *gc)
|
|||
if (!page->mprotected && !page->back_pointers) {
|
||||
page->mprotected = 1;
|
||||
mmu_queue_write_protect_range(mmu, page->addr, APAGE_SIZE, page_mmu_type(page), &page->mmu_src_block);
|
||||
} else if (QUEUED_MPROTECT_IS_PROMISCUOUS)
|
||||
} else if (QUEUED_MPROTECT_INFECTS_MED)
|
||||
page->mprotected = 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,10 +28,11 @@ enum {
|
|||
|
||||
#ifdef USE_BLOCK_CACHE
|
||||
# define USE_ALLOC_CACHE
|
||||
# define QUEUED_MPROTECT_IS_PROMISCUOUS 1
|
||||
# define QUEUED_MPROTECT_INFECTS_SMALL 1
|
||||
#else
|
||||
# define QUEUED_MPROTECT_IS_PROMISCUOUS 0
|
||||
# define QUEUED_MPROTECT_INFECTS_SMALL 0
|
||||
#endif
|
||||
#define QUEUED_MPROTECT_INFECTS_MED 0
|
||||
|
||||
/* Either USE_ALLOC_CACHE or OS_ALLOCATOR_NEEDS_ALIGNMENT must be
|
||||
enabled, unless the lower-level allocator's alignment matches
|
||||
|
|
Loading…
Reference in New Issue
Block a user