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; } }
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); } } }