< prev index next >

src/share/vm/oops/objArrayKlass.inline.hpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 23,102 **** */ #ifndef SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP #define SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP ! #include "gc_implementation/shared/markSweep.inline.hpp" #include "oops/objArrayKlass.hpp" #include "utilities/macros.hpp" - #if INCLUDE_ALL_GCS - #include "gc_implementation/parallelScavenge/psCompactionManager.inline.hpp" - #include "gc_implementation/parallelScavenge/psParallelCompact.hpp" - #endif // INCLUDE_ALL_GCS ! void ObjArrayKlass::oop_follow_contents(oop obj, int index) { ! if (UseCompressedOops) { ! objarray_follow_contents<narrowOop>(obj, index); ! } else { ! objarray_follow_contents<oop>(obj, index); } } ! template <class T> ! void ObjArrayKlass::objarray_follow_contents(oop obj, int index) { ! objArrayOop a = objArrayOop(obj); ! const size_t len = size_t(a->length()); ! const size_t beg_index = size_t(index); ! assert(beg_index < len || len == 0, "index too large"); ! ! const size_t stride = MIN2(len - beg_index, ObjArrayMarkingStride); ! const size_t end_index = beg_index + stride; ! T* const base = (T*)a->base(); ! T* const beg = base + beg_index; ! T* const end = base + end_index; ! ! // Push the non-NULL elements of the next stride on the marking stack. ! for (T* e = beg; e < end; e++) { ! MarkSweep::mark_and_push<T>(e); } ! if (end_index < len) { ! MarkSweep::push_objarray(a, end_index); // Push the continuation. } } ! #if INCLUDE_ALL_GCS ! void ObjArrayKlass::oop_follow_contents(ParCompactionManager* cm, oop obj, ! int index) { if (UseCompressedOops) { ! objarray_follow_contents<narrowOop>(cm, obj, index); } else { ! objarray_follow_contents<oop>(cm, obj, index); } } ! template <class T> ! void ObjArrayKlass::objarray_follow_contents(ParCompactionManager* cm, oop obj, ! int index) { objArrayOop a = objArrayOop(obj); - const size_t len = size_t(a->length()); - const size_t beg_index = size_t(index); - assert(beg_index < len || len == 0, "index too large"); ! const size_t stride = MIN2(len - beg_index, ObjArrayMarkingStride); ! const size_t end_index = beg_index + stride; ! T* const base = (T*)a->base(); ! T* const beg = base + beg_index; ! T* const end = base + end_index; ! // Push the non-NULL elements of the next stride on the marking stack. ! for (T* e = beg; e < end; e++) { ! PSParallelCompact::mark_and_push<T>(cm, e); } ! if (end_index < len) { ! cm->push_objarray(a, end_index); // Push the continuation. } } ! #endif // INCLUDE_ALL_GCS #endif // SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP --- 23,189 ---- */ #ifndef SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP #define SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP ! #include "memory/memRegion.hpp" ! #include "memory/iterator.inline.hpp" #include "oops/objArrayKlass.hpp" + #include "oops/objArrayOop.inline.hpp" + #include "oops/oop.inline.hpp" #include "utilities/macros.hpp" ! template <bool nv, typename T, class OopClosureType> ! void ObjArrayKlass::oop_oop_iterate_elements_specialized(objArrayOop a, OopClosureType* closure) { ! T* p = (T*)a->base(); ! T* const end = p + a->length(); ! ! for (;p < end; p++) { ! Devirtualizer<nv>::do_oop(closure, p); } } ! template <bool nv, typename T, class OopClosureType> ! void ObjArrayKlass::oop_oop_iterate_elements_specialized_bounded( ! objArrayOop a, OopClosureType* closure, void* low, void* high) { ! ! T* const l = (T*)low; ! T* const h = (T*)high; ! ! T* p = (T*)a->base(); ! T* end = p + a->length(); ! ! if (p < l) { ! p = l; ! } ! if (end > h) { ! end = h; } ! for (;p < end; ++p) { ! Devirtualizer<nv>::do_oop(closure, p); } } ! template <bool nv, class OopClosureType> ! void ObjArrayKlass::oop_oop_iterate_elements(objArrayOop a, OopClosureType* closure) { ! if (UseCompressedOops) { ! oop_oop_iterate_elements_specialized<nv, narrowOop>(a, closure); ! } else { ! oop_oop_iterate_elements_specialized<nv, oop>(a, closure); ! } ! } ! ! template <bool nv, class OopClosureType> ! void ObjArrayKlass::oop_oop_iterate_elements_bounded(objArrayOop a, OopClosureType* closure, MemRegion mr) { if (UseCompressedOops) { ! oop_oop_iterate_elements_specialized_bounded<nv, narrowOop>(a, closure, mr.start(), mr.end()); } else { ! oop_oop_iterate_elements_specialized_bounded<nv, oop>(a, closure, mr.start(), mr.end()); ! } ! } ! ! template <bool nv, typename OopClosureType> ! int ObjArrayKlass::oop_oop_iterate(oop obj, OopClosureType* closure) { ! assert (obj->is_array(), "obj must be array"); ! objArrayOop a = objArrayOop(obj); ! ! // Get size before changing pointers. ! // Don't call size() or oop_size() since that is a virtual call. ! int size = a->object_size(); ! if (Devirtualizer<nv>::do_metadata(closure)) { ! Devirtualizer<nv>::do_klass(closure, obj->klass()); } + + oop_oop_iterate_elements<nv>(a, closure); + + return size; } ! template <bool nv, typename OopClosureType> ! int ObjArrayKlass::oop_oop_iterate_bounded(oop obj, OopClosureType* closure, MemRegion mr) { ! assert(obj->is_array(), "obj must be array"); objArrayOop a = objArrayOop(obj); ! // Get size before changing pointers. ! // Don't call size() or oop_size() since that is a virtual call ! int size = a->object_size(); ! ! if (Devirtualizer<nv>::do_metadata(closure)) { ! Devirtualizer<nv>::do_klass(closure, a->klass()); ! } ! ! oop_oop_iterate_elements_bounded<nv>(a, closure, mr); ! ! return size; ! } ! template <bool nv, typename T, class OopClosureType> ! void ObjArrayKlass::oop_oop_iterate_range_specialized(objArrayOop a, OopClosureType* closure, int start, int end) { ! if (Devirtualizer<nv>::do_metadata(closure)) { ! Devirtualizer<nv>::do_klass(closure, a->klass()); } ! T* low = start == 0 ? cast_from_oop<T*>(a) : a->obj_at_addr<T>(start); ! T* high = (T*)a->base() + end; ! ! oop_oop_iterate_elements_specialized_bounded<nv, T>(a, closure, low, high); ! } ! ! // Like oop_oop_iterate but only iterates over a specified range and only used ! // for objArrayOops. ! template <bool nv, class OopClosureType> ! int ObjArrayKlass::oop_oop_iterate_range(oop obj, OopClosureType* closure, int start, int end) { ! assert(obj->is_array(), "obj must be array"); ! objArrayOop a = objArrayOop(obj); ! ! // Get size before changing pointers. ! // Don't call size() or oop_size() since that is a virtual call ! int size = a->object_size(); ! ! if (UseCompressedOops) { ! oop_oop_iterate_range_specialized<nv, narrowOop>(a, closure, start, end); ! } else { ! oop_oop_iterate_range_specialized<nv, oop>(a, closure, start, end); } + + return size; } ! ! ! #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \ ! \ ! int ObjArrayKlass::oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \ ! return oop_oop_iterate<nvs_to_bool(nv_suffix)>(obj, closure); \ ! } ! ! #if INCLUDE_ALL_GCS ! #define ObjArrayKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ ! int ObjArrayKlass::oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \ ! /* No reverse implementation ATM. */ \ ! return oop_oop_iterate<nvs_to_bool(nv_suffix)>(obj, closure); \ ! } ! #else ! #define ObjArrayKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) ! #endif ! ! #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \ ! \ ! int ObjArrayKlass::oop_oop_iterate##nv_suffix##_m(oop obj, OopClosureType* closure, MemRegion mr) { \ ! return oop_oop_iterate_bounded<nvs_to_bool(nv_suffix)>(obj, closure, mr); \ ! } ! ! #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN_r(OopClosureType, nv_suffix) \ ! \ ! int ObjArrayKlass::oop_oop_iterate_range##nv_suffix(oop obj, OopClosureType* closure, int start, int end) { \ ! return oop_oop_iterate_range<nvs_to_bool(nv_suffix)>(obj, closure, start, end); \ ! } ! ! ! #define ALL_OBJ_ARRAY_KLASS_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \ ! ObjArrayKlass_OOP_OOP_ITERATE_DEFN( OopClosureType, nv_suffix) \ ! ObjArrayKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ ! ObjArrayKlass_OOP_OOP_ITERATE_DEFN_m( OopClosureType, nv_suffix) \ ! ObjArrayKlass_OOP_OOP_ITERATE_DEFN_r( OopClosureType, nv_suffix) ! #endif // SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP
< prev index next >