177 {
178 // Verify that the storage points to a parsable object in heap
179 DEBUG_ONLY(oop old_obj = oop(deferred.start());)
180 assert(!_card_table->is_in_young(old_obj),
181 "Else should have been filtered in on_slowpath_allocation_exit()");
182 assert(oopDesc::is_oop(old_obj, true), "Not an oop");
183 assert(deferred.word_size() == (size_t)(old_obj->size()),
184 "Mismatch: multiple objects?");
185 }
186 write_region(deferred);
187 // "Clear" the deferred_card_mark field
188 thread->set_deferred_card_mark(MemRegion());
189 }
190 assert(thread->deferred_card_mark().is_empty(), "invariant");
191 #else
192 assert(!_defer_initial_card_mark, "Should be false");
193 assert(thread->deferred_card_mark().is_empty(), "Should be empty");
194 #endif
195 }
196
197 void CardTableBarrierSet::on_thread_detach(JavaThread* thread) {
198 // The deferred store barriers must all have been flushed to the
199 // card-table (or other remembered set structure) before GC starts
200 // processing the card-table (or other remembered set).
201 flush_deferred_card_mark_barrier(thread);
202 }
203
204 bool CardTableBarrierSet::card_mark_must_follow_store() const {
205 return _card_table->scanned_concurrently();
206 }
|
177 {
178 // Verify that the storage points to a parsable object in heap
179 DEBUG_ONLY(oop old_obj = oop(deferred.start());)
180 assert(!_card_table->is_in_young(old_obj),
181 "Else should have been filtered in on_slowpath_allocation_exit()");
182 assert(oopDesc::is_oop(old_obj, true), "Not an oop");
183 assert(deferred.word_size() == (size_t)(old_obj->size()),
184 "Mismatch: multiple objects?");
185 }
186 write_region(deferred);
187 // "Clear" the deferred_card_mark field
188 thread->set_deferred_card_mark(MemRegion());
189 }
190 assert(thread->deferred_card_mark().is_empty(), "invariant");
191 #else
192 assert(!_defer_initial_card_mark, "Should be false");
193 assert(thread->deferred_card_mark().is_empty(), "Should be empty");
194 #endif
195 }
196
197 void CardTableBarrierSet::on_thread_detach(Thread* thread) {
198 // The deferred store barriers must all have been flushed to the
199 // card-table (or other remembered set structure) before GC starts
200 // processing the card-table (or other remembered set).
201 if (thread->is_Java_thread()) { // Only relevant for Java threads.
202 flush_deferred_card_mark_barrier((JavaThread*)thread);
203 }
204 }
205
206 bool CardTableBarrierSet::card_mark_must_follow_store() const {
207 return _card_table->scanned_concurrently();
208 }
|