8 * This code is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * version 2 for more details (a copy is included in the LICENSE file that
12 * accompanied this code).
13 *
14 * You should have received a copy of the GNU General Public License version
15 * 2 along with this work; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
25 #define SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
26
27 #include "gc/shared/barrierSet.hpp"
28 #include "gc/shenandoah/shenandoahBarrierSet.hpp"
29 #include "gc/shenandoah/shenandoahForwarding.inline.hpp"
30 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
31 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
32 #include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
33 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
34
35 inline oop ShenandoahBarrierSet::resolve_forwarded_not_null(oop p) {
36 return ShenandoahForwarding::get_forwardee(p);
37 }
38
39 inline oop ShenandoahBarrierSet::resolve_forwarded(oop p) {
40 if (((HeapWord*) p) != NULL) {
41 return resolve_forwarded_not_null(p);
42 } else {
43 return p;
44 }
45 }
46
47 template <DecoratorSet decorators, typename BarrierSetT>
48 template <typename T>
49 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap(T* addr) {
50 oop value = Raw::oop_load_in_heap(addr);
51 value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);
52 keep_alive_if_weak(decorators, value);
53 return value;
54 }
55
56 template <DecoratorSet decorators, typename BarrierSetT>
57 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap_at(oop base, ptrdiff_t offset) {
58 oop value = Raw::oop_load_in_heap_at(base, offset);
59 value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);
60 keep_alive_if_weak(AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength<decorators>(base, offset), value);
61 return value;
62 }
63
64 template <DecoratorSet decorators, typename BarrierSetT>
65 template <typename T>
66 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) {
67 oop value = Raw::oop_load_not_in_heap(addr);
68 value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);
69 keep_alive_if_weak(decorators, value);
70 return value;
71 }
72
73 template <DecoratorSet decorators, typename BarrierSetT>
74 template <typename T>
75 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_in_heap(T* addr, oop value) {
76 ShenandoahBarrierSet::barrier_set()->storeval_barrier(value);
77 const bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
78 if (keep_alive) {
79 ShenandoahBarrierSet::barrier_set()->write_ref_field_pre_work(addr, value);
80 }
81 Raw::oop_store_in_heap(addr, value);
82 }
83
84 template <DecoratorSet decorators, typename BarrierSetT>
85 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value) {
86 oop_store_in_heap(AccessInternal::oop_field_addr<decorators>(base, offset), value);
87 }
88
89 template <DecoratorSet decorators, typename BarrierSetT>
90 template <typename T>
91 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) {
92 oop res;
93 oop expected = compare_value;
94 do {
95 compare_value = expected;
96 res = Raw::oop_atomic_cmpxchg(new_value, addr, compare_value);
97 expected = res;
98 } while ((! oopDesc::equals_raw(compare_value, expected)) && oopDesc::equals_raw(resolve_forwarded(compare_value), resolve_forwarded(expected)));
99 if (res != NULL) {
100 return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(res);
101 } else {
102 return res;
|
8 * This code is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * version 2 for more details (a copy is included in the LICENSE file that
12 * accompanied this code).
13 *
14 * You should have received a copy of the GNU General Public License version
15 * 2 along with this work; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
25 #define SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
26
27 #include "gc/shared/barrierSet.hpp"
28 #include "gc/shenandoah/shenandoahAsserts.hpp"
29 #include "gc/shenandoah/shenandoahBarrierSet.hpp"
30 #include "gc/shenandoah/shenandoahForwarding.inline.hpp"
31 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
32 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
33 #include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
34 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
35
36 inline oop ShenandoahBarrierSet::resolve_forwarded_not_null(oop p) {
37 return ShenandoahForwarding::get_forwardee(p);
38 }
39
40 inline oop ShenandoahBarrierSet::resolve_forwarded(oop p) {
41 if (((HeapWord*) p) != NULL) {
42 return resolve_forwarded_not_null(p);
43 } else {
44 return p;
45 }
46 }
47
48 template <DecoratorSet decorators, typename BarrierSetT>
49 template <typename T>
50 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap(T* addr) {
51 oop value = Raw::oop_load_in_heap(addr);
52 value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);
53 keep_alive_if_weak(decorators, value);
54 return value;
55 }
56
57 template <DecoratorSet decorators, typename BarrierSetT>
58 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap_at(oop base, ptrdiff_t offset) {
59 oop value = Raw::oop_load_in_heap_at(base, offset);
60 value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);
61 keep_alive_if_weak(AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength<decorators>(base, offset), value);
62 return value;
63 }
64
65 template <DecoratorSet decorators, typename BarrierSetT>
66 template <typename T>
67 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) {
68 oop value = Raw::oop_load_not_in_heap(addr);
69 if (CompressedOops::is_null(value)) return value;
70
71 ShenandoahHeap* const heap = ShenandoahHeap::heap();
72 if (heap->is_evacuation_in_progress()) {
73 ShenandoahMarkingContext* const marking_context = heap->complete_marking_context();
74 if (!marking_context->is_marked(value)) {
75 return NULL;
76 }
77 }
78
79 value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(value);
80 keep_alive_if_weak(decorators, value);
81 return value;
82 }
83
84 template <DecoratorSet decorators, typename BarrierSetT>
85 template <typename T>
86 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_in_heap(T* addr, oop value) {
87 ShenandoahBarrierSet::barrier_set()->storeval_barrier(value);
88 const bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
89 if (keep_alive) {
90 ShenandoahBarrierSet::barrier_set()->write_ref_field_pre_work(addr, value);
91 }
92 Raw::oop_store_in_heap(addr, value);
93 }
94
95 #ifdef ASSERT
96 template <DecoratorSet decorators, typename BarrierSetT>
97 template <typename T>
98 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_not_in_heap(T* addr, oop value) {
99 ShenandoahHeap* const heap = ShenandoahHeap::heap();
100 shenandoah_assert_marked_if(NULL, value, !CompressedOops::is_null(value) && heap->is_evacuation_in_progress());
101
102 Raw::oop_store(addr, value);
103 }
104 #endif
105
106 template <DecoratorSet decorators, typename BarrierSetT>
107 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value) {
108 oop_store_in_heap(AccessInternal::oop_field_addr<decorators>(base, offset), value);
109 }
110
111 template <DecoratorSet decorators, typename BarrierSetT>
112 template <typename T>
113 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) {
114 oop res;
115 oop expected = compare_value;
116 do {
117 compare_value = expected;
118 res = Raw::oop_atomic_cmpxchg(new_value, addr, compare_value);
119 expected = res;
120 } while ((! oopDesc::equals_raw(compare_value, expected)) && oopDesc::equals_raw(resolve_forwarded(compare_value), resolve_forwarded(expected)));
121 if (res != NULL) {
122 return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(res);
123 } else {
124 return res;
|