diff options
| -rw-r--r-- | gc.c | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -5210,18 +5210,27 @@ static void invalidate_moved_page(rb_objspace_t *objspace, struct heap_page *pag #if GC_CAN_COMPILE_COMPACTION static void -read_barrier_handler(uintptr_t address) +read_barrier_handler(uintptr_t original_address) { VALUE obj; rb_objspace_t * objspace = &rb_objspace; - address -= address % BASE_SLOT_SIZE; + /* Calculate address aligned to slots. */ + uintptr_t address = original_address - (original_address % BASE_SLOT_SIZE); obj = (VALUE)address; + struct heap_page_body *page_body = GET_PAGE_BODY(obj); + + /* If the page_body is NULL, then mprotect cannot handle it and will crash + * with "Cannot allocate memory". */ + if (page_body == NULL) { + rb_bug("read_barrier_handler: segmentation fault at 0x%lx", original_address); + } + RB_VM_LOCK_ENTER(); { - unlock_page_body(objspace, GET_PAGE_BODY(obj)); + unlock_page_body(objspace, page_body); objspace->profile.read_barrier_faults++; |
