void operator()(cell* slot_ptr) { if (immediate_p(*slot_ptr)) return; generation target = generation_of(parent, untag<object>(*slot_ptr)); if (gen == aging_generation && target == nursery_generation) { check_write_barrier(slot_ptr, target, card_points_to_nursery); } else if (gen == tenured_generation) { if (target == nursery_generation) { check_write_barrier(slot_ptr, target, card_points_to_nursery); } else if (target == aging_generation) { check_write_barrier(slot_ptr, target, card_points_to_aging); } } }
void write_ptr(void *obj, tField &field, const tVal &val) { assert(sizeof(val) == sizeof(uintptr_t)); if ((!obj || generation_of(obj) > m_generation) && is_generation(val, m_generation)) { // TODO: What to do when this happens? Maybe it should be a deque anyways. if (m_free < sizeof(Remembered)) throw std::runtime_error("No free space for remembered set! PANIC!"); TRACE_PRINTF(TRACE_GC, TRACE_DEBUG, "Write barrier (%u), adding: %p(%s) <- %p(%s)\n", m_generation, &field, obj && is_generation(&obj, m_generation)? "yes":"no", *(void**)&val, is_generation(val, m_generation)? "yes":"no"); m_free -= sizeof(Remembered); Remembered *r = --m_remembered_set; VALGRIND_MEMPOOL_ALLOC(m_data, r, sizeof(Remembered)); r->in_object = obj; r->location = (uintptr_t*)&field; r->val = *(uintptr_t*)&val; } }
void operator()(cell *slot_ptr) { if(!immediate_p(*slot_ptr)) { generation target = generation_of(parent,untag<object>(*slot_ptr)); switch(gen) { case nursery_generation: break; case aging_generation: if(target == nursery_generation) check_write_barrier(slot_ptr,target,card_points_to_nursery); break; case tenured_generation: if(target == nursery_generation) check_write_barrier(slot_ptr,target,card_points_to_nursery); else if(target == aging_generation) check_write_barrier(slot_ptr,target,card_points_to_aging); break; } } }