51
52 // Process queue entries and release resources.
53 void flush() { flush_impl(); }
54
55 // Compiler support.
56 static ByteSize byte_offset_of_index() {
57 return PtrQueue::byte_offset_of_index<DirtyCardQueue>();
58 }
59 using PtrQueue::byte_width_of_index;
60
61 static ByteSize byte_offset_of_buf() {
62 return PtrQueue::byte_offset_of_buf<DirtyCardQueue>();
63 }
64 using PtrQueue::byte_width_of_buf;
65
66 };
67
68
69
70 class DirtyCardQueueSet: public PtrQueueSet {
71 // The closure used in mut_process_buffer().
72 CardTableEntryClosure* _mut_process_closure;
73
74 DirtyCardQueue _shared_dirty_card_queue;
75
76 // Apply the closure to the elements of "node" from it's index to
77 // buffer_size. If all closure applications return true, then
78 // returns true. Stops processing after the first closure
79 // application that returns false, and returns false from this
80 // function. If "consume" is true, the node's index is updated to
81 // exclude the processed elements, e.g. up to the element for which
82 // the closure returned false.
83 bool apply_closure_to_buffer(CardTableEntryClosure* cl,
84 BufferNode* node,
85 bool consume,
86 uint worker_i = 0);
87
88 bool mut_process_buffer(BufferNode* node);
89
90 // Protected by the _cbl_mon.
91 FreeIdSet* _free_ids;
92
93 // The number of completed buffers processed by mutator and rs thread,
94 // respectively.
95 jint _processed_buffers_mut;
96 jint _processed_buffers_rs_thread;
97
98 // Current buffer node used for parallel iteration.
99 BufferNode* volatile _cur_par_buffer_node;
100
101 void concatenate_log(DirtyCardQueue& dcq);
102
103 public:
104 DirtyCardQueueSet(bool notify_when_complete = true);
105
106 void initialize(CardTableEntryClosure* cl,
107 Monitor* cbl_mon,
108 Mutex* fl_lock,
109 int process_completed_threshold,
110 int max_completed_queue,
111 Mutex* lock,
112 DirtyCardQueueSet* fl_owner,
113 bool init_free_ids = false);
114
115 // The number of parallel ids that can be claimed to allow collector or
116 // mutator threads to do card-processing work.
117 static uint num_par_ids();
118
119 static void handle_zero_index_for_thread(JavaThread* t);
120
121 // If there are more than stop_at completed buffers, pop one, apply
122 // the specified closure to its active elements, and return true.
123 // Otherwise return false.
124 //
125 // A completely processed buffer is freed. However, if a closure
126 // invocation returns false, processing is stopped and the partially
127 // processed buffer (with its index updated to exclude the processed
128 // elements, e.g. up to the element for which the closure returned
129 // false) is returned to the completed buffer set.
130 //
131 // If during_pause is true, stop_at must be zero, and the closure
132 // must never return false.
133 bool apply_closure_to_completed_buffer(CardTableEntryClosure* cl,
134 uint worker_i,
135 size_t stop_at,
136 bool during_pause);
137
138 BufferNode* get_completed_buffer(size_t stop_at);
139
140 void reset_for_par_iteration() { _cur_par_buffer_node = _completed_buffers_head; }
141 // Applies the current closure to all completed buffers, non-consumptively.
142 // Can be used in parallel, all callers using the iteration state initialized
143 // by reset_for_par_iteration.
144 void par_apply_closure_to_all_completed_buffers(CardTableEntryClosure* cl);
145
146 DirtyCardQueue* shared_dirty_card_queue() {
147 return &_shared_dirty_card_queue;
148 }
149
150 // Deallocate any completed log buffers
151 void clear();
152
153 // If a full collection is happening, reset partial logs, and ignore
154 // completed ones: the full collection will make them all irrelevant.
155 void abandon_logs();
156
|
51
52 // Process queue entries and release resources.
53 void flush() { flush_impl(); }
54
55 // Compiler support.
56 static ByteSize byte_offset_of_index() {
57 return PtrQueue::byte_offset_of_index<DirtyCardQueue>();
58 }
59 using PtrQueue::byte_width_of_index;
60
61 static ByteSize byte_offset_of_buf() {
62 return PtrQueue::byte_offset_of_buf<DirtyCardQueue>();
63 }
64 using PtrQueue::byte_width_of_buf;
65
66 };
67
68
69
70 class DirtyCardQueueSet: public PtrQueueSet {
71 DirtyCardQueue _shared_dirty_card_queue;
72
73 // Apply the closure to the elements of "node" from it's index to
74 // buffer_size. If all closure applications return true, then
75 // returns true. Stops processing after the first closure
76 // application that returns false, and returns false from this
77 // function. If "consume" is true, the node's index is updated to
78 // exclude the processed elements, e.g. up to the element for which
79 // the closure returned false.
80 bool apply_closure_to_buffer(CardTableEntryClosure* cl,
81 BufferNode* node,
82 bool consume,
83 uint worker_i = 0);
84
85 // If there are more than stop_at completed buffers, pop one, apply
86 // the specified closure to its active elements, and return true.
87 // Otherwise return false.
88 //
89 // A completely processed buffer is freed. However, if a closure
90 // invocation returns false, processing is stopped and the partially
91 // processed buffer (with its index updated to exclude the processed
92 // elements, e.g. up to the element for which the closure returned
93 // false) is returned to the completed buffer set.
94 //
95 // If during_pause is true, stop_at must be zero, and the closure
96 // must never return false.
97 bool apply_closure_to_completed_buffer(CardTableEntryClosure* cl,
98 uint worker_i,
99 size_t stop_at,
100 bool during_pause);
101
102 bool mut_process_buffer(BufferNode* node);
103
104 // Protected by the _cbl_mon.
105 FreeIdSet* _free_ids;
106
107 // The number of completed buffers processed by mutator and rs thread,
108 // respectively.
109 jint _processed_buffers_mut;
110 jint _processed_buffers_rs_thread;
111
112 // Current buffer node used for parallel iteration.
113 BufferNode* volatile _cur_par_buffer_node;
114
115 void concatenate_log(DirtyCardQueue& dcq);
116
117 public:
118 DirtyCardQueueSet(bool notify_when_complete = true);
119
120 void initialize(Monitor* cbl_mon,
121 Mutex* fl_lock,
122 int process_completed_threshold,
123 int max_completed_queue,
124 Mutex* lock,
125 DirtyCardQueueSet* fl_owner,
126 bool init_free_ids = false);
127
128 // The number of parallel ids that can be claimed to allow collector or
129 // mutator threads to do card-processing work.
130 static uint num_par_ids();
131
132 static void handle_zero_index_for_thread(JavaThread* t);
133
134 // Apply G1RefineCardConcurrentlyClosure to completed buffers until there are stop_at
135 // completed buffers remaining.
136 bool refine_completed_buffer_concurrently(uint worker_i, size_t stop_at);
137
138 // Apply the given closure to all completed buffers. The given closure's do_card_ptr
139 // must never return false. Must only be called during GC.
140 bool apply_closure_during_gc(CardTableEntryClosure* cl, uint worker_i);
141
142 BufferNode* get_completed_buffer(size_t stop_at);
143
144 void reset_for_par_iteration() { _cur_par_buffer_node = _completed_buffers_head; }
145 // Applies the current closure to all completed buffers, non-consumptively.
146 // Can be used in parallel, all callers using the iteration state initialized
147 // by reset_for_par_iteration.
148 void par_apply_closure_to_all_completed_buffers(CardTableEntryClosure* cl);
149
150 DirtyCardQueue* shared_dirty_card_queue() {
151 return &_shared_dirty_card_queue;
152 }
153
154 // Deallocate any completed log buffers
155 void clear();
156
157 // If a full collection is happening, reset partial logs, and ignore
158 // completed ones: the full collection will make them all irrelevant.
159 void abandon_logs();
160
|