19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #include "precompiled.hpp"
25 #include "gc/g1/g1BarrierSet.inline.hpp"
26 #include "gc/g1/g1BarrierSetAssembler.hpp"
27 #include "gc/g1/g1CardTable.inline.hpp"
28 #include "gc/g1/g1CollectedHeap.inline.hpp"
29 #include "gc/g1/g1ThreadLocalData.hpp"
30 #include "gc/g1/heapRegion.hpp"
31 #include "gc/g1/satbMarkQueue.hpp"
32 #include "logging/log.hpp"
33 #include "oops/access.inline.hpp"
34 #include "oops/compressedOops.inline.hpp"
35 #include "oops/oop.inline.hpp"
36 #include "runtime/mutexLocker.hpp"
37 #include "runtime/thread.inline.hpp"
38 #include "utilities/macros.hpp"
39
40 SATBMarkQueueSet G1BarrierSet::_satb_mark_queue_set;
41 DirtyCardQueueSet G1BarrierSet::_dirty_card_queue_set;
42
43 G1BarrierSet::G1BarrierSet(G1CardTable* card_table) :
44 CardTableBarrierSet(make_barrier_set_assembler<G1BarrierSetAssembler>(),
45 card_table,
46 BarrierSet::FakeRtti(BarrierSet::G1BarrierSet)) {}
47
48 void G1BarrierSet::enqueue(oop pre_val) {
49 // Nulls should have been already filtered.
50 assert(oopDesc::is_oop(pre_val, true), "Error");
51
52 if (!_satb_mark_queue_set.is_active()) return;
53 Thread* thr = Thread::current();
54 if (thr->is_Java_thread()) {
55 G1ThreadLocalData::satb_mark_queue(thr).enqueue(pre_val);
56 } else {
57 MutexLockerEx x(Shared_SATB_Q_lock, Mutex::_no_safepoint_check_flag);
58 _satb_mark_queue_set.shared_satb_queue()->enqueue(pre_val);
59 }
60 }
61
62 void G1BarrierSet::write_ref_array_pre_oop_entry(oop* dst, size_t length) {
63 G1BarrierSet *bs = barrier_set_cast<G1BarrierSet>(BarrierSet::barrier_set());
|
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #include "precompiled.hpp"
25 #include "gc/g1/g1BarrierSet.inline.hpp"
26 #include "gc/g1/g1BarrierSetAssembler.hpp"
27 #include "gc/g1/g1CardTable.inline.hpp"
28 #include "gc/g1/g1CollectedHeap.inline.hpp"
29 #include "gc/g1/g1ThreadLocalData.hpp"
30 #include "gc/g1/heapRegion.hpp"
31 #include "gc/g1/satbMarkQueue.hpp"
32 #include "logging/log.hpp"
33 #include "oops/access.inline.hpp"
34 #include "oops/compressedOops.inline.hpp"
35 #include "oops/oop.inline.hpp"
36 #include "runtime/mutexLocker.hpp"
37 #include "runtime/thread.inline.hpp"
38 #include "utilities/macros.hpp"
39 #ifdef COMPILER1
40 #include "gc/g1/c1/g1BarrierSetC1.hpp"
41 #endif
42
43 class G1BarrierSetC1;
44
45 SATBMarkQueueSet G1BarrierSet::_satb_mark_queue_set;
46 DirtyCardQueueSet G1BarrierSet::_dirty_card_queue_set;
47
48 G1BarrierSet::G1BarrierSet(G1CardTable* card_table) :
49 CardTableBarrierSet(make_barrier_set_assembler<G1BarrierSetAssembler>(),
50 make_barrier_set_c1<G1BarrierSetC1>(),
51 card_table,
52 BarrierSet::FakeRtti(BarrierSet::G1BarrierSet)) {}
53
54 void G1BarrierSet::enqueue(oop pre_val) {
55 // Nulls should have been already filtered.
56 assert(oopDesc::is_oop(pre_val, true), "Error");
57
58 if (!_satb_mark_queue_set.is_active()) return;
59 Thread* thr = Thread::current();
60 if (thr->is_Java_thread()) {
61 G1ThreadLocalData::satb_mark_queue(thr).enqueue(pre_val);
62 } else {
63 MutexLockerEx x(Shared_SATB_Q_lock, Mutex::_no_safepoint_check_flag);
64 _satb_mark_queue_set.shared_satb_queue()->enqueue(pre_val);
65 }
66 }
67
68 void G1BarrierSet::write_ref_array_pre_oop_entry(oop* dst, size_t length) {
69 G1BarrierSet *bs = barrier_set_cast<G1BarrierSet>(BarrierSet::barrier_set());
|