8201316: Move G1-related static members from JavaThread to G1BarrierSet
Reviewed-by: stefank, shade
--- a/src/hotspot/share/gc/g1/g1BarrierSet.cpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1BarrierSet.cpp Thu Apr 12 08:25:30 2018 +0200
@@ -37,25 +37,26 @@
#include "runtime/thread.inline.hpp"
#include "utilities/macros.hpp"
+SATBMarkQueueSet G1BarrierSet::_satb_mark_queue_set;
+DirtyCardQueueSet G1BarrierSet::_dirty_card_queue_set;
+
G1BarrierSet::G1BarrierSet(G1CardTable* card_table) :
CardTableBarrierSet(make_barrier_set_assembler<G1BarrierSetAssembler>(),
card_table,
- BarrierSet::FakeRtti(BarrierSet::G1BarrierSet)),
- _dcqs(JavaThread::dirty_card_queue_set())
-{ }
+ BarrierSet::FakeRtti(BarrierSet::G1BarrierSet)) {}
void G1BarrierSet::enqueue(oop pre_val) {
// Nulls should have been already filtered.
assert(oopDesc::is_oop(pre_val, true), "Error");
- if (!JavaThread::satb_mark_queue_set().is_active()) return;
+ if (!_satb_mark_queue_set.is_active()) return;
Thread* thr = Thread::current();
if (thr->is_Java_thread()) {
JavaThread* jt = (JavaThread*)thr;
jt->satb_mark_queue().enqueue(pre_val);
} else {
MutexLockerEx x(Shared_SATB_Q_lock, Mutex::_no_safepoint_check_flag);
- JavaThread::satb_mark_queue_set().shared_satb_queue()->enqueue(pre_val);
+ _satb_mark_queue_set.shared_satb_queue()->enqueue(pre_val);
}
}
@@ -76,7 +77,7 @@
template <class T> void
G1BarrierSet::write_ref_array_pre_work(T* dst, size_t count) {
- if (!JavaThread::satb_mark_queue_set().is_active()) return;
+ if (!_satb_mark_queue_set.is_active()) return;
T* elem_ptr = dst;
for (size_t i = 0; i < count; i++, elem_ptr++) {
T heap_oop = RawAccess<>::oop_load(elem_ptr);
@@ -111,7 +112,7 @@
} else {
MutexLockerEx x(Shared_DirtyCardQ_lock,
Mutex::_no_safepoint_check_flag);
- _dcqs.shared_dirty_card_queue()->enqueue(byte);
+ _dirty_card_queue_set.shared_dirty_card_queue()->enqueue(byte);
}
}
}
@@ -149,7 +150,7 @@
}
if (*byte != G1CardTable::dirty_card_val()) {
*byte = G1CardTable::dirty_card_val();
- _dcqs.shared_dirty_card_queue()->enqueue(byte);
+ _dirty_card_queue_set.shared_dirty_card_queue()->enqueue(byte);
}
}
}
@@ -181,7 +182,7 @@
// If we are creating the thread during a marking cycle, we should
// set the active field of the SATB queue to true.
- if (thread->satb_mark_queue_set().is_active()) {
+ if (_satb_mark_queue_set.is_active()) {
thread->satb_mark_queue().set_active(true);
}
}
--- a/src/hotspot/share/gc/g1/g1BarrierSet.hpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1BarrierSet.hpp Thu Apr 12 08:25:30 2018 +0200
@@ -25,6 +25,8 @@
#ifndef SHARE_VM_GC_G1_G1BARRIERSET_HPP
#define SHARE_VM_GC_G1_G1BARRIERSET_HPP
+#include "gc/g1/dirtyCardQueue.hpp"
+#include "gc/g1/satbMarkQueue.hpp"
#include "gc/shared/cardTableBarrierSet.hpp"
class DirtyCardQueueSet;
@@ -37,7 +39,8 @@
class G1BarrierSet: public CardTableBarrierSet {
friend class VMStructs;
private:
- DirtyCardQueueSet& _dcqs;
+ static SATBMarkQueueSet _satb_mark_queue_set;
+ static DirtyCardQueueSet _dirty_card_queue_set;
public:
G1BarrierSet(G1CardTable* table);
@@ -74,6 +77,14 @@
virtual void on_thread_attach(JavaThread* thread);
virtual void on_thread_detach(JavaThread* thread);
+ static SATBMarkQueueSet& satb_mark_queue_set() {
+ return _satb_mark_queue_set;
+ }
+
+ static DirtyCardQueueSet& dirty_card_queue_set() {
+ return _dirty_card_queue_set;
+ }
+
// Callbacks for runtime accesses.
template <DecoratorSet decorators, typename BarrierSetT = G1BarrierSet>
class AccessBarrier: public ModRefBarrierSet::AccessBarrier<decorators, BarrierSetT> {
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Thu Apr 12 08:25:30 2018 +0200
@@ -30,6 +30,7 @@
#include "code/icBuffer.hpp"
#include "gc/g1/bufferingOopClosure.hpp"
#include "gc/g1/g1Allocator.inline.hpp"
+#include "gc/g1/g1BarrierSet.hpp"
#include "gc/g1/g1CollectedHeap.inline.hpp"
#include "gc/g1/g1CollectionSet.hpp"
#include "gc/g1/g1CollectorPolicy.hpp"
@@ -1036,7 +1037,7 @@
}
// Discard all remembered set updates.
- JavaThread::dirty_card_queue_set().abandon_logs();
+ G1BarrierSet::dirty_card_queue_set().abandon_logs();
assert(dirty_card_queue_set().completed_buffers_num() == 0, "DCQS should be empty");
}
@@ -1636,10 +1637,10 @@
// Perform any initialization actions delegated to the policy.
g1_policy()->init(this, &_collection_set);
- JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon,
- SATB_Q_FL_lock,
- G1SATBProcessCompletedThreshold,
- Shared_SATB_Q_lock);
+ G1BarrierSet::satb_mark_queue_set().initialize(SATB_Q_CBL_mon,
+ SATB_Q_FL_lock,
+ G1SATBProcessCompletedThreshold,
+ Shared_SATB_Q_lock);
jint ecode = initialize_concurrent_refinement();
if (ecode != JNI_OK) {
@@ -1651,20 +1652,20 @@
return ecode;
}
- JavaThread::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
- DirtyCardQ_FL_lock,
- (int)concurrent_refine()->yellow_zone(),
- (int)concurrent_refine()->red_zone(),
- Shared_DirtyCardQ_lock,
- NULL, // fl_owner
- true); // init_free_ids
+ G1BarrierSet::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
+ DirtyCardQ_FL_lock,
+ (int)concurrent_refine()->yellow_zone(),
+ (int)concurrent_refine()->red_zone(),
+ Shared_DirtyCardQ_lock,
+ NULL, // fl_owner
+ true); // init_free_ids
dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
DirtyCardQ_FL_lock,
-1, // never trigger processing
-1, // no limit on length
Shared_DirtyCardQ_lock,
- &JavaThread::dirty_card_queue_set());
+ &G1BarrierSet::dirty_card_queue_set());
// Here we allocate the dummy HeapRegion that is required by the
// G1AllocRegion class.
@@ -1833,7 +1834,7 @@
}
void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl, uint worker_i) {
- DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
size_t n_completed_buffers = 0;
while (dcqs.apply_closure_during_gc(cl, worker_i)) {
n_completed_buffers++;
@@ -2467,7 +2468,7 @@
DirtyCardQueue& dcq = curr->dirty_card_queue();
extra_cards += dcq.size();
}
- DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
size_t buffer_size = dcqs.buffer_size();
size_t buffer_num = dcqs.completed_buffers_num();
@@ -2551,7 +2552,7 @@
RegisterHumongousWithInCSetFastTestClosure()
: _total_humongous(0),
_candidate_humongous(0),
- _dcq(&JavaThread::dirty_card_queue_set()) {
+ _dcq(&G1BarrierSet::dirty_card_queue_set()) {
}
virtual bool do_heap_region(HeapRegion* r) {
@@ -3623,7 +3624,7 @@
dirty_card_queue_set().reset_for_par_iteration();
workers()->run_task(&redirty_task);
- DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcq = G1BarrierSet::dirty_card_queue_set();
dcq.merge_bufferlists(&dirty_card_queue_set());
assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
--- a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp Thu Apr 12 08:25:30 2018 +0200
@@ -26,6 +26,7 @@
#include "classfile/metadataOnStackMark.hpp"
#include "classfile/symbolTable.hpp"
#include "code/codeCache.hpp"
+#include "gc/g1/g1BarrierSet.hpp"
#include "gc/g1/g1CollectedHeap.inline.hpp"
#include "gc/g1/g1CollectorState.hpp"
#include "gc/g1/g1ConcurrentMark.inline.hpp"
@@ -405,7 +406,7 @@
assert(CGC_lock != NULL, "CGC_lock must be initialized");
- SATBMarkQueueSet& satb_qs = JavaThread::satb_mark_queue_set();
+ SATBMarkQueueSet& satb_qs = G1BarrierSet::satb_mark_queue_set();
satb_qs.set_buffer_size(G1SATBBufferSize);
_root_regions.init(_g1h->survivor(), this);
@@ -762,7 +763,7 @@
rp->enable_discovery();
rp->setup_policy(false); // snapshot the soft ref policy to be used in this cycle
- SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
+ SATBMarkQueueSet& satb_mq_set = G1BarrierSet::satb_mark_queue_set();
// This is the start of the marking cycle, we're expected all
// threads to have SATB queues with active set to false.
satb_mq_set.set_active_all_threads(true, /* new active value */
@@ -1073,7 +1074,7 @@
if (mark_finished) {
weak_refs_work(false /* clear_all_soft_refs */);
- SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
+ SATBMarkQueueSet& satb_mq_set = G1BarrierSet::satb_mark_queue_set();
// We're done with marking.
// This is the end of the marking cycle, we're expected all
// threads to have SATB queues with active set to true.
@@ -1695,7 +1696,7 @@
}
} else if (thread->is_VM_thread()) {
if (thread->claim_oops_do(true, _thread_parity)) {
- JavaThread::satb_mark_queue_set().shared_satb_queue()->apply_closure_and_empty(&_cm_satb_cl);
+ G1BarrierSet::satb_mark_queue_set().shared_satb_queue()->apply_closure_and_empty(&_cm_satb_cl);
}
}
}
@@ -1755,7 +1756,7 @@
_g1h->workers()->run_task(&remarkTask);
}
- SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
+ SATBMarkQueueSet& satb_mq_set = G1BarrierSet::satb_mark_queue_set();
guarantee(has_overflown() ||
satb_mq_set.completed_buffers_num() == 0,
"Invariant: has_overflown = %s, num buffers = " SIZE_FORMAT,
@@ -1937,7 +1938,7 @@
_second_overflow_barrier_sync.abort();
_has_aborted = true;
- SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
+ SATBMarkQueueSet& satb_mq_set = G1BarrierSet::satb_mark_queue_set();
satb_mq_set.abandon_partial_marking();
// This can be called either during or outside marking, we'll read
// the expected_active value from the SATB queue set.
@@ -2147,7 +2148,7 @@
// (6) Finally, we check whether there are enough completed STAB
// buffers available for processing. If there are, we abort.
- SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
+ SATBMarkQueueSet& satb_mq_set = G1BarrierSet::satb_mark_queue_set();
if (!_draining_satb_buffers && satb_mq_set.process_completed_buffers()) {
// we do need to process SATB buffers, we'll abort and restart
// the marking task to do so
@@ -2302,7 +2303,7 @@
_draining_satb_buffers = true;
G1CMSATBBufferClosure satb_cl(this, _g1h);
- SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
+ SATBMarkQueueSet& satb_mq_set = G1BarrierSet::satb_mark_queue_set();
// This keeps claiming and applying the closure to completed buffers
// until we run out of buffers or we need to abort.
--- a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp Thu Apr 12 08:25:30 2018 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "gc/g1/g1BarrierSet.hpp"
#include "gc/g1/g1ConcurrentRefine.hpp"
#include "gc/g1/g1ConcurrentRefineThread.hpp"
#include "logging/log.hpp"
@@ -377,7 +378,7 @@
void G1ConcurrentRefine::adjust(double update_rs_time,
size_t update_rs_processed_buffers,
double goal_ms) {
- DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
if (G1UseAdaptiveConcRefinement) {
update_zones(update_rs_time, update_rs_processed_buffers, goal_ms);
@@ -425,7 +426,7 @@
}
bool G1ConcurrentRefine::do_refinement_step(uint worker_id) {
- DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
size_t curr_buffer_num = dcqs.completed_buffers_num();
// If the number of the buffers falls down into the yellow zone,
--- a/src/hotspot/share/gc/g1/g1ConcurrentRefineThread.cpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1ConcurrentRefineThread.cpp Thu Apr 12 08:25:30 2018 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "gc/g1/g1BarrierSet.hpp"
#include "gc/g1/g1ConcurrentRefine.hpp"
#include "gc/g1/g1ConcurrentRefineThread.hpp"
#include "gc/shared/suspendibleThreadSet.hpp"
@@ -63,7 +64,7 @@
}
bool G1ConcurrentRefineThread::is_active() {
- DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
return is_primary() ? dcqs.process_completed_buffers() : _active;
}
@@ -72,7 +73,7 @@
if (!is_primary()) {
set_active(true);
} else {
- DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
dcqs.set_process_completed(true);
}
_monitor->notify();
@@ -83,7 +84,7 @@
if (!is_primary()) {
set_active(false);
} else {
- DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
dcqs.set_process_completed(false);
}
}
@@ -101,7 +102,7 @@
size_t buffers_processed = 0;
log_debug(gc, refine)("Activated worker %d, on threshold: " SIZE_FORMAT ", current: " SIZE_FORMAT,
_worker_id, _cr->activation_threshold(_worker_id),
- JavaThread::dirty_card_queue_set().completed_buffers_num());
+ G1BarrierSet::dirty_card_queue_set().completed_buffers_num());
{
SuspendibleThreadSetJoiner sts_join;
@@ -123,7 +124,7 @@
log_debug(gc, refine)("Deactivated worker %d, off threshold: " SIZE_FORMAT
", current: " SIZE_FORMAT ", processed: " SIZE_FORMAT,
_worker_id, _cr->deactivation_threshold(_worker_id),
- JavaThread::dirty_card_queue_set().completed_buffers_num(),
+ G1BarrierSet::dirty_card_queue_set().completed_buffers_num(),
buffers_processed);
if (os::supports_vtime()) {
--- a/src/hotspot/share/gc/g1/g1RemSet.cpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1RemSet.cpp Thu Apr 12 08:25:30 2018 +0200
@@ -24,6 +24,7 @@
#include "precompiled.hpp"
#include "gc/g1/dirtyCardQueue.hpp"
+#include "gc/g1/g1BarrierSet.hpp"
#include "gc/g1/g1BlockOffsetTable.inline.hpp"
#include "gc/g1/g1CardTable.inline.hpp"
#include "gc/g1/g1CollectedHeap.inline.hpp"
@@ -488,7 +489,7 @@
}
void G1RemSet::prepare_for_oops_into_collection_set_do() {
- DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
dcqs.concatenate_logs();
_scan_state->reset();
@@ -641,7 +642,7 @@
MutexLockerEx x(Shared_DirtyCardQ_lock,
Mutex::_no_safepoint_check_flag);
DirtyCardQueue* sdcq =
- JavaThread::dirty_card_queue_set().shared_dirty_card_queue();
+ G1BarrierSet::dirty_card_queue_set().shared_dirty_card_queue();
sdcq->enqueue(card_ptr);
}
} else {
--- a/src/hotspot/share/gc/g1/g1RemSetSummary.cpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1RemSetSummary.cpp Thu Apr 12 08:25:30 2018 +0200
@@ -53,7 +53,7 @@
void G1RemSetSummary::update() {
_num_conc_refined_cards = _rem_set->num_conc_refined_cards();
- DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
+ DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
_num_processed_buf_mutator = dcqs.processed_buffers_mut();
_num_processed_buf_rs_threads = dcqs.processed_buffers_rs_thread();
--- a/src/hotspot/share/gc/g1/g1RootProcessor.cpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1RootProcessor.cpp Thu Apr 12 08:25:30 2018 +0200
@@ -29,6 +29,7 @@
#include "classfile/systemDictionary.hpp"
#include "code/codeCache.hpp"
#include "gc/g1/bufferingOopClosure.hpp"
+#include "gc/g1/g1BarrierSet.hpp"
#include "gc/g1/g1CodeBlobClosure.hpp"
#include "gc/g1/g1CollectedHeap.inline.hpp"
#include "gc/g1/g1CollectorState.hpp"
@@ -134,7 +135,7 @@
{
G1GCParPhaseTimesTracker x(phase_times, G1GCPhaseTimes::SATBFiltering, worker_i);
if (!_process_strong_tasks.is_task_claimed(G1RP_PS_filter_satb_buffers) && _g1h->collector_state()->mark_or_rebuild_in_progress()) {
- JavaThread::satb_mark_queue_set().filter_thread_buffers();
+ G1BarrierSet::satb_mark_queue_set().filter_thread_buffers();
}
}
--- a/src/hotspot/share/runtime/thread.cpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/runtime/thread.cpp Thu Apr 12 08:25:30 2018 +0200
@@ -115,6 +115,7 @@
#include "utilities/vmError.hpp"
#if INCLUDE_ALL_GCS
#include "gc/cms/concurrentMarkSweepThread.hpp"
+#include "gc/g1/g1BarrierSet.hpp"
#include "gc/g1/g1ConcurrentMarkThread.inline.hpp"
#include "gc/parallel/pcTasks.hpp"
#endif // INCLUDE_ALL_GCS
@@ -1589,16 +1590,11 @@
pd_initialize();
}
-#if INCLUDE_ALL_GCS
-SATBMarkQueueSet JavaThread::_satb_mark_queue_set;
-DirtyCardQueueSet JavaThread::_dirty_card_queue_set;
-#endif // INCLUDE_ALL_GCS
-
JavaThread::JavaThread(bool is_attaching_via_jni) :
Thread()
#if INCLUDE_ALL_GCS
- , _satb_mark_queue(&_satb_mark_queue_set),
- _dirty_card_queue(&_dirty_card_queue_set)
+ , _satb_mark_queue(&G1BarrierSet::satb_mark_queue_set()),
+ _dirty_card_queue(&G1BarrierSet::dirty_card_queue_set())
#endif // INCLUDE_ALL_GCS
{
initialize();
@@ -1664,8 +1660,8 @@
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) :
Thread()
#if INCLUDE_ALL_GCS
- , _satb_mark_queue(&_satb_mark_queue_set),
- _dirty_card_queue(&_dirty_card_queue_set)
+ , _satb_mark_queue(&G1BarrierSet::satb_mark_queue_set()),
+ _dirty_card_queue(&G1BarrierSet::dirty_card_queue_set())
#endif // INCLUDE_ALL_GCS
{
initialize();
--- a/src/hotspot/share/runtime/thread.hpp Wed Mar 28 22:03:57 2018 +0200
+++ b/src/hotspot/share/runtime/thread.hpp Thu Apr 12 08:25:30 2018 +0200
@@ -1063,12 +1063,8 @@
// Support for G1 barriers
SATBMarkQueue _satb_mark_queue; // Thread-local log for SATB barrier.
- // Set of all such queues.
- static SATBMarkQueueSet _satb_mark_queue_set;
DirtyCardQueue _dirty_card_queue; // Thread-local log for dirty cards.
- // Set of all such queues.
- static DirtyCardQueueSet _dirty_card_queue_set;
#endif // INCLUDE_ALL_GCS
friend class VMThread;
@@ -1948,15 +1944,9 @@
#if INCLUDE_ALL_GCS
// SATB marking queue support
SATBMarkQueue& satb_mark_queue() { return _satb_mark_queue; }
- static SATBMarkQueueSet& satb_mark_queue_set() {
- return _satb_mark_queue_set;
- }
// Dirty card queue support
DirtyCardQueue& dirty_card_queue() { return _dirty_card_queue; }
- static DirtyCardQueueSet& dirty_card_queue_set() {
- return _dirty_card_queue_set;
- }
#endif // INCLUDE_ALL_GCS
// Machine dependent stuff