< prev index next >
src/hotspot/share/gc/g1/g1DirtyCardQueue.hpp
Print this page
rev 57716 : [mq]: remove_cbl_mon
*** 1,7 ****
/*
! * Copyright (c) 2001, 2019, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2001, 2020, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 27,41 ****
#include "gc/g1/g1BufferNodeList.hpp"
#include "gc/g1/g1FreeIdSet.hpp"
#include "gc/shared/ptrQueue.hpp"
#include "memory/allocation.hpp"
class G1DirtyCardQueueSet;
class G1RedirtyCardsQueueSet;
class Thread;
- class Monitor;
// A ptrQueue whose elements are "oops", pointers to object heads.
class G1DirtyCardQueue: public PtrQueue {
protected:
virtual void handle_completed_buffer();
--- 27,42 ----
#include "gc/g1/g1BufferNodeList.hpp"
#include "gc/g1/g1FreeIdSet.hpp"
#include "gc/shared/ptrQueue.hpp"
#include "memory/allocation.hpp"
+ #include "memory/padded.hpp"
+ class G1ConcurrentRefineThread;
class G1DirtyCardQueueSet;
class G1RedirtyCardsQueueSet;
class Thread;
// A ptrQueue whose elements are "oops", pointers to object heads.
class G1DirtyCardQueue: public PtrQueue {
protected:
virtual void handle_completed_buffer();
*** 64,85 ****
using PtrQueue::byte_width_of_buf;
};
class G1DirtyCardQueueSet: public PtrQueueSet {
! Monitor* _cbl_mon; // Protects the list and count members.
! BufferNode* _completed_buffers_head;
! BufferNode* _completed_buffers_tail;
!
! // Number of actual cards in the list of completed buffers.
volatile size_t _num_cards;
! size_t _process_cards_threshold;
! volatile bool _process_completed_buffers;
void abandon_completed_buffers();
// Refine the cards in "node" from its index to buffer_size.
// Stops processing if SuspendibleThreadSet::should_yield() is true.
// Returns true if the entire buffer was processed, false if there
// is a pending yield request. The node's index is updated to exclude
// the processed elements, e.g. up to the element before processing
--- 65,113 ----
using PtrQueue::byte_width_of_buf;
};
class G1DirtyCardQueueSet: public PtrQueueSet {
! G1ConcurrentRefineThread* _primary_refinement_thread;
! // Add padding for improved performance for shared access. There's only
! // one instance of this class, so using a little extra space is fine.
! // _completed_buffers_{head,tail} and _num_cards are isolated to their
! // own cache lines. Other members are not, even if shared access, because
! // they aren't as critical to performance.
! DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, sizeof(G1ConcurrentRefineThread*));
! BufferNode* volatile _completed_buffers_head;
! DEFINE_PAD_MINUS_SIZE(2, DEFAULT_CACHE_LINE_SIZE, sizeof(BufferNode* volatile));
! BufferNode* volatile _completed_buffers_tail;
! DEFINE_PAD_MINUS_SIZE(3, DEFAULT_CACHE_LINE_SIZE, sizeof(BufferNode* volatile));
volatile size_t _num_cards;
+ DEFINE_PAD_MINUS_SIZE(4, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile size_t));
! DEBUG_ONLY(mutable volatile int _concurrency;)
! class ConcurrentVerifier;
! class NonconcurrentVerifier;
!
! size_t append_buffers(BufferNode* first, BufferNode* last, size_t card_count);
! // Verify _num_cards == sum of cards in the completed queue.
! void verify_num_cards() const NOT_DEBUG_RETURN;
!
! struct PauseList {
! BufferNode* volatile _head;
! BufferNode* _tail;
! PauseList() : _head(NULL), _tail(NULL) {}
! };
! PauseList _paused[2];
!
! void record_paused_buffer(BufferNode* node);
! void enqueue_paused_buffers_aux(size_t index);
! void enqueue_previous_paused_buffers();
! void enqueue_all_paused_buffers();
+ void clear_completed_buffers();
void abandon_completed_buffers();
+ size_t _process_cards_threshold;
+
// Refine the cards in "node" from its index to buffer_size.
// Stops processing if SuspendibleThreadSet::should_yield() is true.
// Returns true if the entire buffer was processed, false if there
// is a pending yield request. The node's index is updated to exclude
// the processed elements, e.g. up to the element before processing
*** 101,113 ****
// Array of cumulative dirty cards refined by mutator threads.
// Array has an entry per id in _free_ids.
size_t* _mutator_refined_cards_counters;
public:
! G1DirtyCardQueueSet(Monitor* cbl_mon, BufferNode::Allocator* allocator);
~G1DirtyCardQueueSet();
// The number of parallel ids that can be claimed to allow collector or
// mutator threads to do card-processing work.
static uint num_par_ids();
static void handle_zero_index_for_thread(Thread* t);
--- 129,145 ----
// Array of cumulative dirty cards refined by mutator threads.
// Array has an entry per id in _free_ids.
size_t* _mutator_refined_cards_counters;
public:
! G1DirtyCardQueueSet(BufferNode::Allocator* allocator);
~G1DirtyCardQueueSet();
+ void set_primary_refinement_thread(G1ConcurrentRefineThread* thread) {
+ _primary_refinement_thread = thread;
+ }
+
// The number of parallel ids that can be claimed to allow collector or
// mutator threads to do card-processing work.
static uint num_par_ids();
static void handle_zero_index_for_thread(Thread* t);
*** 124,140 ****
BufferNode* get_completed_buffer(size_t stop_at = 0);
// The number of cards in completed buffers. Read without synchronization.
size_t num_cards() const { return _num_cards; }
- // Verify that _num_cards is equal to the sum of actual cards
- // in the completed buffers.
- void verify_num_cards() const NOT_DEBUG_RETURN;
-
- bool process_completed_buffers() { return _process_completed_buffers; }
- void set_process_completed_buffers(bool x) { _process_completed_buffers = x; }
-
// Get/Set the number of cards that triggers log processing.
// Log processing should be done when the number of cards exceeds the
// threshold.
void set_process_cards_threshold(size_t sz) {
_process_cards_threshold = sz;
--- 156,165 ----
< prev index next >