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_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_HPP
25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_HPP
26
27 #include "gc/shared/accessBarrierSupport.hpp"
28 #include "gc/shared/barrierSet.hpp"
29 #include "gc/shenandoah/shenandoahHeap.hpp"
30 #include "gc/shenandoah/shenandoahSATBMarkQueueSet.hpp"
31
32 class ShenandoahBarrierSet: public BarrierSet {
33 private:
34
35 enum ArrayCopyStoreValMode {
36 NONE,
37 READ_BARRIER,
38 WRITE_BARRIER_MAYBE_ENQUEUE,
39 WRITE_BARRIER_ALWAYS_ENQUEUE
40 };
41
42 static ShenandoahSATBMarkQueueSet _satb_mark_queue_set;
43
44 ShenandoahHeap* _heap;
45
46 public:
47
48 ShenandoahBarrierSet(ShenandoahHeap* heap);
49
50 static SATBMarkQueueSet& satb_mark_queue_set() {
51 return _satb_mark_queue_set;
52 }
53
54 void print_on(outputStream* st) const;
55
56 bool is_a(BarrierSet::Name bsn);
57
58 bool is_aligned(HeapWord* hw);
59 void resize_covered_region(MemRegion mr);
97
98 virtual oop write_barrier(oop obj);
99 static oopDesc* write_barrier_IRT(oopDesc* src);
100 static oopDesc* write_barrier_JRT(oopDesc* src);
101
102 virtual oop storeval_barrier(oop obj);
103
104 virtual void keep_alive_barrier(oop obj);
105
106 bool obj_equals(oop obj1, oop obj2);
107
108 #ifdef ASSERT
109 virtual void verify_safe_oop(oop p);
110 #endif
111
112 static void enqueue(oop obj);
113
114 private:
115 bool need_update_refs_barrier();
116
117 template <class T, bool UPDATE_MATRIX, bool STOREVAL_WRITE_BARRIER, bool ALWAYS_ENQUEUE>
118 void write_ref_array_loop(HeapWord* start, size_t count);
119
120 oop write_barrier_impl(oop obj);
121
122 static void keep_alive_if_weak(DecoratorSet decorators, oop value) {
123 assert((decorators & ON_UNKNOWN_OOP_REF) == 0, "Reference strength must be known");
124 const bool on_strong_oop_ref = (decorators & ON_STRONG_OOP_REF) != 0;
125 const bool peek = (decorators & AS_NO_KEEPALIVE) != 0;
126 if (!peek && !on_strong_oop_ref && value != NULL) {
127 ((ShenandoahBarrierSet*) BarrierSet::barrier_set())->keep_alive_barrier(value);
128 }
129 }
130
131 template <typename T>
132 bool arraycopy_loop_1(T* src, T* dst, size_t length, Klass* bound,
133 bool checkcast, bool satb, bool matrix, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
134
135 template <typename T, bool CHECKCAST>
136 bool arraycopy_loop_2(T* src, T* dst, size_t length, Klass* bound,
137 bool satb, bool matrix, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
|
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_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_HPP
25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_HPP
26
27 #include "gc/shared/accessBarrierSupport.hpp"
28 #include "gc/shared/barrierSet.hpp"
29 #include "gc/shenandoah/shenandoahHeap.hpp"
30 #include "gc/shenandoah/shenandoahSATBMarkQueueSet.hpp"
31
32 class ShenandoahBarrierSet: public BarrierSet {
33 private:
34
35 enum ArrayCopyStoreValMode {
36 NONE,
37 READ_BARRIER,
38 WRITE_BARRIER
39 };
40
41 static ShenandoahSATBMarkQueueSet _satb_mark_queue_set;
42
43 ShenandoahHeap* _heap;
44
45 public:
46
47 ShenandoahBarrierSet(ShenandoahHeap* heap);
48
49 static SATBMarkQueueSet& satb_mark_queue_set() {
50 return _satb_mark_queue_set;
51 }
52
53 void print_on(outputStream* st) const;
54
55 bool is_a(BarrierSet::Name bsn);
56
57 bool is_aligned(HeapWord* hw);
58 void resize_covered_region(MemRegion mr);
96
97 virtual oop write_barrier(oop obj);
98 static oopDesc* write_barrier_IRT(oopDesc* src);
99 static oopDesc* write_barrier_JRT(oopDesc* src);
100
101 virtual oop storeval_barrier(oop obj);
102
103 virtual void keep_alive_barrier(oop obj);
104
105 bool obj_equals(oop obj1, oop obj2);
106
107 #ifdef ASSERT
108 virtual void verify_safe_oop(oop p);
109 #endif
110
111 static void enqueue(oop obj);
112
113 private:
114 bool need_update_refs_barrier();
115
116 template <class T, bool UPDATE_MATRIX, bool STOREVAL_WRITE_BARRIER>
117 void write_ref_array_loop(HeapWord* start, size_t count);
118
119 oop write_barrier_impl(oop obj);
120
121 static void keep_alive_if_weak(DecoratorSet decorators, oop value) {
122 assert((decorators & ON_UNKNOWN_OOP_REF) == 0, "Reference strength must be known");
123 const bool on_strong_oop_ref = (decorators & ON_STRONG_OOP_REF) != 0;
124 const bool peek = (decorators & AS_NO_KEEPALIVE) != 0;
125 if (!peek && !on_strong_oop_ref && value != NULL) {
126 ((ShenandoahBarrierSet*) BarrierSet::barrier_set())->keep_alive_barrier(value);
127 }
128 }
129
130 template <typename T>
131 bool arraycopy_loop_1(T* src, T* dst, size_t length, Klass* bound,
132 bool checkcast, bool satb, bool matrix, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
133
134 template <typename T, bool CHECKCAST>
135 bool arraycopy_loop_2(T* src, T* dst, size_t length, Klass* bound,
136 bool satb, bool matrix, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
|