Example #1
0
static PageInfo*
find_page_and_cell(GCObjectPtr ptr, uint32_t *cell_idx)
{
    Arena *arena = find_arena(ptr);

    if (EJS_LIKELY (arena != NULL)) {
        SANITY(verify_arena(arena));

        int page_index = PTR_TO_ARENA_PAGE_INDEX(ptr);

        if (page_index < 0 || page_index > arena->num_pages) {
            return NULL;
        }

        PageInfo *page = arena->page_infos[page_index];

        if (!IS_ALIGNED_TO(ptr, page->cell_size)) {
            return NULL; // can't possibly point to allocated cells.
        }

        if (cell_idx) {
            *cell_idx = PTR_TO_CELL(ptr, page);
            EJS_ASSERT(*cell_idx >= 0 && *cell_idx < CELLS_IN_PAGE(page));
        }

        return page;
    }

    // check if it's in the LOS
    LOCK_GC();
    for (LargeObjectInfo *lobj = los_list; lobj; lobj = lobj->next) {
        if (lobj->page_info.page_start == ptr) {
            if (cell_idx) {
                *cell_idx = 0;
            }
            UNLOCK_GC();
            return &lobj->page_info;
        }
    }
    UNLOCK_GC();
    return NULL;
}
Example #2
0
uintptr_t ptr_to_arena_page_index(void* ptr) { return PTR_TO_ARENA_PAGE_INDEX(ptr); }