static int get_available_dtask_cache_index(void)
{
	int index = -1;
	int i,j;
	unsigned long flags;

	spin_lock_irqsave(&dtask_bitmap_lock, flags);
	for(i = 0; i < BITMAP_SIZE ; i++)
	{
		if (bitmap_not_available(dtask_bitmap[i]))
				continue;

		for( j=0; j<BITS_PER_LONG ; j++)
		{
			if (!(dtask_bitmap[i] & BIT(j)))
			{
				mark_bitmap(dtask_bitmap[i], j);			
				index = (i * BITS_PER_LONG) + j;
				goto out;
			}

		}
	}
out:
	spin_unlock_irqrestore(&dtask_bitmap_lock, flags);

	return index;
}
inline bool PSParallelCompact::mark_obj(oop obj) {
  const int obj_size = obj->size();
  if (mark_bitmap()->mark_obj(obj, obj_size)) {
    _summary_data.add_obj(obj, obj_size);
    return true;
  } else {
    return false;
  }
}
Ejemplo n.º 3
0
inline void ParCompactionManager::mark_and_push(T* p) {
  T heap_oop = oopDesc::load_heap_oop(p);
  if (!oopDesc::is_null(heap_oop)) {
    oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap");

    if (mark_bitmap()->is_unmarked(obj) && PSParallelCompact::mark_obj(obj)) {
      push(obj);
    }
  }
}