8258508: Merge G1RedirtyCardsQueue into qset
Reviewed-by: tschatzl, iwalulya
This commit is contained in:
parent
bec60432ec
commit
d423d368e7
@ -41,7 +41,6 @@ class UpdateLogBuffersDeferred : public BasicOopIterateClosure {
|
|||||||
private:
|
private:
|
||||||
G1CollectedHeap* _g1h;
|
G1CollectedHeap* _g1h;
|
||||||
G1RedirtyCardsLocalQueueSet* _rdc_local_qset;
|
G1RedirtyCardsLocalQueueSet* _rdc_local_qset;
|
||||||
G1RedirtyCardsQueue* _rdcq;
|
|
||||||
G1CardTable* _ct;
|
G1CardTable* _ct;
|
||||||
|
|
||||||
// Remember the last enqueued card to avoid enqueuing the same card over and over;
|
// Remember the last enqueued card to avoid enqueuing the same card over and over;
|
||||||
@ -49,11 +48,9 @@ private:
|
|||||||
size_t _last_enqueued_card;
|
size_t _last_enqueued_card;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UpdateLogBuffersDeferred(G1RedirtyCardsLocalQueueSet* rdc_local_qset,
|
UpdateLogBuffersDeferred(G1RedirtyCardsLocalQueueSet* rdc_local_qset) :
|
||||||
G1RedirtyCardsQueue* rdcq) :
|
|
||||||
_g1h(G1CollectedHeap::heap()),
|
_g1h(G1CollectedHeap::heap()),
|
||||||
_rdc_local_qset(rdc_local_qset),
|
_rdc_local_qset(rdc_local_qset),
|
||||||
_rdcq(rdcq),
|
|
||||||
_ct(_g1h->card_table()),
|
_ct(_g1h->card_table()),
|
||||||
_last_enqueued_card(SIZE_MAX) {}
|
_last_enqueued_card(SIZE_MAX) {}
|
||||||
|
|
||||||
@ -73,7 +70,7 @@ public:
|
|||||||
}
|
}
|
||||||
size_t card_index = _ct->index_for(p);
|
size_t card_index = _ct->index_for(p);
|
||||||
if (card_index != _last_enqueued_card) {
|
if (card_index != _last_enqueued_card) {
|
||||||
_rdc_local_qset->enqueue(*_rdcq, _ct->byte_for_index(card_index));
|
_rdc_local_qset->enqueue(_ct->byte_for_index(card_index));
|
||||||
_last_enqueued_card = card_index;
|
_last_enqueued_card = card_index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -206,7 +203,6 @@ class RemoveSelfForwardPtrHRClosure: public HeapRegionClosure {
|
|||||||
uint _worker_id;
|
uint _worker_id;
|
||||||
|
|
||||||
G1RedirtyCardsLocalQueueSet _rdc_local_qset;
|
G1RedirtyCardsLocalQueueSet _rdc_local_qset;
|
||||||
G1RedirtyCardsQueue _rdcq;
|
|
||||||
UpdateLogBuffersDeferred _log_buffer_cl;
|
UpdateLogBuffersDeferred _log_buffer_cl;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -214,12 +210,10 @@ public:
|
|||||||
_g1h(G1CollectedHeap::heap()),
|
_g1h(G1CollectedHeap::heap()),
|
||||||
_worker_id(worker_id),
|
_worker_id(worker_id),
|
||||||
_rdc_local_qset(rdcqs),
|
_rdc_local_qset(rdcqs),
|
||||||
_rdcq(&_rdc_local_qset),
|
_log_buffer_cl(&_rdc_local_qset) {
|
||||||
_log_buffer_cl(&_rdc_local_qset, &_rdcq) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~RemoveSelfForwardPtrHRClosure() {
|
~RemoveSelfForwardPtrHRClosure() {
|
||||||
_rdc_local_qset.flush_queue(_rdcq);
|
|
||||||
_rdc_local_qset.flush();
|
_rdc_local_qset.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,6 @@ G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h,
|
|||||||
: _g1h(g1h),
|
: _g1h(g1h),
|
||||||
_task_queue(g1h->task_queue(worker_id)),
|
_task_queue(g1h->task_queue(worker_id)),
|
||||||
_rdc_local_qset(rdcqs),
|
_rdc_local_qset(rdcqs),
|
||||||
_rdcq(&_rdc_local_qset),
|
|
||||||
_ct(g1h->card_table()),
|
_ct(g1h->card_table()),
|
||||||
_closures(NULL),
|
_closures(NULL),
|
||||||
_plab_allocator(NULL),
|
_plab_allocator(NULL),
|
||||||
@ -114,7 +113,6 @@ G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h,
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t G1ParScanThreadState::flush(size_t* surviving_young_words) {
|
size_t G1ParScanThreadState::flush(size_t* surviving_young_words) {
|
||||||
_rdc_local_qset.flush_queue(_rdcq);
|
|
||||||
_rdc_local_qset.flush();
|
_rdc_local_qset.flush();
|
||||||
flush_numa_stats();
|
flush_numa_stats();
|
||||||
// Update allocation statistics.
|
// Update allocation statistics.
|
||||||
|
@ -49,7 +49,6 @@ class G1ParScanThreadState : public CHeapObj<mtGC> {
|
|||||||
G1CollectedHeap* _g1h;
|
G1CollectedHeap* _g1h;
|
||||||
G1ScannerTasksQueue* _task_queue;
|
G1ScannerTasksQueue* _task_queue;
|
||||||
G1RedirtyCardsLocalQueueSet _rdc_local_qset;
|
G1RedirtyCardsLocalQueueSet _rdc_local_qset;
|
||||||
G1RedirtyCardsQueue _rdcq;
|
|
||||||
G1CardTable* _ct;
|
G1CardTable* _ct;
|
||||||
G1EvacuationRootClosures* _closures;
|
G1EvacuationRootClosures* _closures;
|
||||||
|
|
||||||
@ -148,7 +147,7 @@ public:
|
|||||||
size_t card_index = ct()->index_for(p);
|
size_t card_index = ct()->index_for(p);
|
||||||
// If the card hasn't been added to the buffer, do it.
|
// If the card hasn't been added to the buffer, do it.
|
||||||
if (_last_enqueued_card != card_index) {
|
if (_last_enqueued_card != card_index) {
|
||||||
_rdc_local_qset.enqueue(_rdcq, ct()->byte_for_index(card_index));
|
_rdc_local_qset.enqueue(ct()->byte_for_index(card_index));
|
||||||
_last_enqueued_card = card_index;
|
_last_enqueued_card = card_index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,8 @@
|
|||||||
G1RedirtyCardsLocalQueueSet::G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset) :
|
G1RedirtyCardsLocalQueueSet::G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset) :
|
||||||
PtrQueueSet(shared_qset->allocator()),
|
PtrQueueSet(shared_qset->allocator()),
|
||||||
_shared_qset(shared_qset),
|
_shared_qset(shared_qset),
|
||||||
_buffers()
|
_buffers(),
|
||||||
|
_queue(this)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
@ -53,33 +54,30 @@ void G1RedirtyCardsLocalQueueSet::enqueue_completed_buffer(BufferNode* node) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1RedirtyCardsLocalQueueSet::enqueue(G1RedirtyCardsQueue& queue, void* value) {
|
void G1RedirtyCardsLocalQueueSet::enqueue(void* value) {
|
||||||
if (!try_enqueue(queue, value)) {
|
if (!try_enqueue(_queue, value)) {
|
||||||
BufferNode* old_node = exchange_buffer_with_new(queue);
|
BufferNode* old_node = exchange_buffer_with_new(_queue);
|
||||||
if (old_node != nullptr) {
|
if (old_node != nullptr) {
|
||||||
enqueue_completed_buffer(old_node);
|
enqueue_completed_buffer(old_node);
|
||||||
}
|
}
|
||||||
retry_enqueue(queue, value);
|
retry_enqueue(_queue, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1RedirtyCardsLocalQueueSet::flush() {
|
void G1RedirtyCardsLocalQueueSet::flush() {
|
||||||
|
flush_queue(_queue);
|
||||||
_shared_qset->add_bufferlist(_buffers);
|
_shared_qset->add_bufferlist(_buffers);
|
||||||
_buffers = G1BufferNodeList();
|
_buffers = G1BufferNodeList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1RedirtyCardsLocalQueueSet::flush_queue(G1RedirtyCardsQueue& queue) {
|
// G1RedirtyCardsLocalQueueSet::Queue
|
||||||
PtrQueueSet::flush_queue(queue);
|
|
||||||
}
|
|
||||||
|
|
||||||
// G1RedirtyCardsQueue
|
G1RedirtyCardsLocalQueueSet::Queue::Queue(G1RedirtyCardsLocalQueueSet* qset) :
|
||||||
|
|
||||||
G1RedirtyCardsQueue::G1RedirtyCardsQueue(G1RedirtyCardsLocalQueueSet* qset) :
|
|
||||||
PtrQueue(qset)
|
PtrQueue(qset)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
G1RedirtyCardsQueue::~G1RedirtyCardsQueue() {
|
G1RedirtyCardsLocalQueueSet::Queue::~Queue() {
|
||||||
assert(buffer() == nullptr, "unflushed queue");
|
assert(buffer() == nullptr, "unflushed queue");
|
||||||
}
|
}
|
||||||
#endif // ASSERT
|
#endif // ASSERT
|
||||||
|
@ -28,37 +28,34 @@
|
|||||||
#include "gc/g1/g1BufferNodeList.hpp"
|
#include "gc/g1/g1BufferNodeList.hpp"
|
||||||
#include "gc/shared/ptrQueue.hpp"
|
#include "gc/shared/ptrQueue.hpp"
|
||||||
#include "memory/padded.hpp"
|
#include "memory/padded.hpp"
|
||||||
|
#include "utilities/macros.hpp"
|
||||||
|
|
||||||
class G1RedirtyCardsQueue;
|
|
||||||
class G1RedirtyCardsQueueSet;
|
class G1RedirtyCardsQueueSet;
|
||||||
|
|
||||||
// Provide G1RedirtyCardsQueue with a thread-local qset. It provides an
|
// A thread-local qset and queue. It provides an uncontended staging
|
||||||
// uncontended staging area for completed buffers, to be flushed to the
|
// area for completed buffers, to be flushed to the shared qset en masse.
|
||||||
// shared qset en masse.
|
class G1RedirtyCardsLocalQueueSet : private PtrQueueSet {
|
||||||
class G1RedirtyCardsLocalQueueSet : public PtrQueueSet {
|
class Queue : public PtrQueue {
|
||||||
|
public:
|
||||||
|
Queue(G1RedirtyCardsLocalQueueSet* qset);
|
||||||
|
~Queue() NOT_DEBUG(= default);
|
||||||
|
};
|
||||||
|
|
||||||
G1RedirtyCardsQueueSet* _shared_qset;
|
G1RedirtyCardsQueueSet* _shared_qset;
|
||||||
G1BufferNodeList _buffers;
|
G1BufferNodeList _buffers;
|
||||||
|
Queue _queue;
|
||||||
|
|
||||||
|
// Add the buffer to the local list.
|
||||||
|
virtual void enqueue_completed_buffer(BufferNode* node);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset);
|
G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset);
|
||||||
~G1RedirtyCardsLocalQueueSet() NOT_DEBUG(= default);
|
~G1RedirtyCardsLocalQueueSet() NOT_DEBUG(= default);
|
||||||
|
|
||||||
void enqueue(G1RedirtyCardsQueue& queue, void* value);
|
void enqueue(void* value);
|
||||||
|
|
||||||
// Add the buffer to the local list.
|
|
||||||
virtual void enqueue_completed_buffer(BufferNode* node);
|
|
||||||
|
|
||||||
// Transfer all completed buffers to the shared qset.
|
// Transfer all completed buffers to the shared qset.
|
||||||
void flush();
|
void flush();
|
||||||
|
|
||||||
void flush_queue(G1RedirtyCardsQueue& queue);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Worker-local queues of card table entries.
|
|
||||||
class G1RedirtyCardsQueue : public PtrQueue {
|
|
||||||
public:
|
|
||||||
G1RedirtyCardsQueue(G1RedirtyCardsLocalQueueSet* qset);
|
|
||||||
~G1RedirtyCardsQueue() NOT_DEBUG(= default);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Card table entries to be redirtied and the cards reprocessed later.
|
// Card table entries to be redirtied and the cards reprocessed later.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user