32 _kind = G1SATBCT; |
32 _kind = G1SATBCT; |
33 } |
33 } |
34 |
34 |
35 |
35 |
36 void G1SATBCardTableModRefBS::enqueue(oop pre_val) { |
36 void G1SATBCardTableModRefBS::enqueue(oop pre_val) { |
|
37 assert(pre_val->is_oop_or_null(true), "Error"); |
37 if (!JavaThread::satb_mark_queue_set().active()) return; |
38 if (!JavaThread::satb_mark_queue_set().active()) return; |
38 Thread* thr = Thread::current(); |
39 Thread* thr = Thread::current(); |
39 if (thr->is_Java_thread()) { |
40 if (thr->is_Java_thread()) { |
40 JavaThread* jt = (JavaThread*)thr; |
41 JavaThread* jt = (JavaThread*)thr; |
41 jt->satb_mark_queue().enqueue(pre_val); |
42 jt->satb_mark_queue().enqueue(pre_val); |
44 JavaThread::satb_mark_queue_set().shared_satb_queue()->enqueue(pre_val); |
45 JavaThread::satb_mark_queue_set().shared_satb_queue()->enqueue(pre_val); |
45 } |
46 } |
46 } |
47 } |
47 |
48 |
48 // When we know the current java thread: |
49 // When we know the current java thread: |
49 void |
50 template <class T> void |
50 G1SATBCardTableModRefBS::write_ref_field_pre_static(void* field, |
51 G1SATBCardTableModRefBS::write_ref_field_pre_static(T* field, |
51 oop newVal, |
52 oop new_val, |
52 JavaThread* jt) { |
53 JavaThread* jt) { |
53 if (!JavaThread::satb_mark_queue_set().active()) return; |
54 if (!JavaThread::satb_mark_queue_set().active()) return; |
54 assert(!UseCompressedOops, "Else will need to modify this to deal with narrowOop"); |
55 T heap_oop = oopDesc::load_heap_oop(field); |
55 oop preVal = *(oop*)field; |
56 if (!oopDesc::is_null(heap_oop)) { |
56 if (preVal != NULL) { |
57 oop pre_val = oopDesc::decode_heap_oop_not_null(heap_oop); |
57 jt->satb_mark_queue().enqueue(preVal); |
58 assert(pre_val->is_oop(true /* ignore mark word */), "Error"); |
|
59 jt->satb_mark_queue().enqueue(pre_val); |
58 } |
60 } |
59 } |
61 } |
60 |
62 |
61 void |
63 template <class T> void |
62 G1SATBCardTableModRefBS::write_ref_array_pre(MemRegion mr) { |
64 G1SATBCardTableModRefBS::write_ref_array_pre_work(T* dst, int count) { |
63 if (!JavaThread::satb_mark_queue_set().active()) return; |
65 if (!JavaThread::satb_mark_queue_set().active()) return; |
64 assert(!UseCompressedOops, "Else will need to modify this to deal with narrowOop"); |
66 T* elem_ptr = dst; |
65 oop* elem_ptr = (oop*)mr.start(); |
67 for (int i = 0; i < count; i++, elem_ptr++) { |
66 while ((HeapWord*)elem_ptr < mr.end()) { |
68 T heap_oop = oopDesc::load_heap_oop(elem_ptr); |
67 oop elem = *elem_ptr; |
69 if (!oopDesc::is_null(heap_oop)) { |
68 if (elem != NULL) enqueue(elem); |
70 enqueue(oopDesc::decode_heap_oop_not_null(heap_oop)); |
69 elem_ptr++; |
71 } |
70 } |
72 } |
71 } |
73 } |
72 |
|
73 |
|
74 |
74 |
75 G1SATBCardTableLoggingModRefBS:: |
75 G1SATBCardTableLoggingModRefBS:: |
76 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap, |
76 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap, |
77 int max_covered_regions) : |
77 int max_covered_regions) : |
78 G1SATBCardTableModRefBS(whole_heap, max_covered_regions), |
78 G1SATBCardTableModRefBS(whole_heap, max_covered_regions), |