20 * questions. |
20 * questions. |
21 * |
21 * |
22 */ |
22 */ |
23 |
23 |
24 #include "precompiled.hpp" |
24 #include "precompiled.hpp" |
25 #include "gc/shenandoah/shenandoahBarrierSet.hpp" |
25 #include "gc/shenandoah/shenandoahBarrierSet.inline.hpp" |
26 #include "gc/shenandoah/shenandoahRuntime.hpp" |
26 #include "gc/shenandoah/shenandoahRuntime.hpp" |
27 #include "gc/shenandoah/shenandoahThreadLocalData.hpp" |
27 #include "gc/shenandoah/shenandoahThreadLocalData.hpp" |
28 #include "runtime/interfaceSupport.inline.hpp" |
28 #include "runtime/interfaceSupport.inline.hpp" |
29 #include "oops/oop.inline.hpp" |
29 #include "oops/oop.inline.hpp" |
30 |
30 |
31 void ShenandoahRuntime::write_ref_array_pre_oop_entry(oop* dst, size_t length) { |
31 void ShenandoahRuntime::write_ref_array_pre_oop_entry(oop* src, oop* dst, size_t length) { |
32 ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); |
32 ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); |
33 bs->write_ref_array_pre(dst, length, false); |
33 bs->arraycopy_pre(src, dst, length); |
34 } |
34 } |
35 |
35 |
36 void ShenandoahRuntime::write_ref_array_pre_narrow_oop_entry(narrowOop* dst, size_t length) { |
36 void ShenandoahRuntime::write_ref_array_pre_narrow_oop_entry(narrowOop* src, narrowOop* dst, size_t length) { |
37 ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); |
37 ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); |
38 bs->write_ref_array_pre(dst, length, false); |
38 bs->arraycopy_pre(src, dst, length); |
39 } |
39 } |
40 |
40 |
41 void ShenandoahRuntime::write_ref_array_post_entry(HeapWord* dst, size_t length) { |
41 void ShenandoahRuntime::write_ref_array_pre_duinit_oop_entry(oop* src, oop* dst, size_t length) { |
42 ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); |
42 ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); |
43 bs->ShenandoahBarrierSet::write_ref_array(dst, length); |
43 bs->arraycopy_update(src, length); |
|
44 } |
|
45 |
|
46 void ShenandoahRuntime::write_ref_array_pre_duinit_narrow_oop_entry(narrowOop* src, narrowOop* dst, size_t length) { |
|
47 ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); |
|
48 bs->arraycopy_update(src, length); |
44 } |
49 } |
45 |
50 |
46 // Shenandoah pre write barrier slowpath |
51 // Shenandoah pre write barrier slowpath |
47 JRT_LEAF(void, ShenandoahRuntime::write_ref_field_pre_entry(oopDesc* orig, JavaThread *thread)) |
52 JRT_LEAF(void, ShenandoahRuntime::write_ref_field_pre_entry(oopDesc* orig, JavaThread *thread)) |
48 if (orig == NULL) { |
53 if (orig == NULL) { |
60 return (oopDesc*) result; |
65 return (oopDesc*) result; |
61 JRT_END |
66 JRT_END |
62 |
67 |
63 // Shenandoah clone barrier: makes sure that references point to to-space |
68 // Shenandoah clone barrier: makes sure that references point to to-space |
64 // in cloned objects. |
69 // in cloned objects. |
65 JRT_LEAF(void, ShenandoahRuntime::shenandoah_clone_barrier(oopDesc* obj)) |
70 JRT_LEAF(void, ShenandoahRuntime::shenandoah_clone_barrier(oopDesc* s, oopDesc* d, size_t length)) |
66 ShenandoahBarrierSet::barrier_set()->write_region(MemRegion((HeapWord*) obj, obj->size())); |
71 oop src = oop(s); |
|
72 oop dst = oop(d); |
|
73 shenandoah_assert_correct(NULL, src); |
|
74 shenandoah_assert_correct(NULL, dst); |
|
75 ShenandoahBarrierSet::barrier_set()->clone_barrier(src); |
|
76 RawAccessBarrier<IS_NOT_NULL>::clone(src, dst, length); |
67 JRT_END |
77 JRT_END |
68 |
78 |
69 JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_native(oopDesc * src)) |
79 JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_native(oopDesc * src)) |
70 return (oopDesc*) ShenandoahBarrierSet::barrier_set()->oop_load_from_native_barrier(oop(src)); |
80 return (oopDesc*) ShenandoahBarrierSet::barrier_set()->oop_load_from_native_barrier(oop(src)); |
71 JRT_END |
81 JRT_END |