Пример #1
0
  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);
      }
    }
  }
Пример #2
0
		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;
			}
		}
Пример #3
0
	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;
			}
		}
	}