23 */ |
23 */ |
24 |
24 |
25 #ifndef SHARE_GC_G1_G1REDIRTYCARDSQUEUE_HPP |
25 #ifndef SHARE_GC_G1_G1REDIRTYCARDSQUEUE_HPP |
26 #define SHARE_GC_G1_G1REDIRTYCARDSQUEUE_HPP |
26 #define SHARE_GC_G1_G1REDIRTYCARDSQUEUE_HPP |
27 |
27 |
|
28 #include "gc/g1/g1BufferNodeList.hpp" |
28 #include "gc/shared/ptrQueue.hpp" |
29 #include "gc/shared/ptrQueue.hpp" |
29 #include "memory/allocation.hpp" |
30 #include "memory/allocation.hpp" |
30 #include "memory/padded.hpp" |
31 #include "memory/padded.hpp" |
31 |
32 |
32 class G1CardTableEntryClosure; |
33 class G1CardTableEntryClosure; |
33 class G1RedirtyCardsQueue; |
34 class G1RedirtyCardsQueue; |
34 class G1RedirtyCardsQueueSet; |
35 class G1RedirtyCardsQueueSet; |
35 |
|
36 struct G1RedirtyCardsBufferList { |
|
37 BufferNode* _head; |
|
38 BufferNode* _tail; |
|
39 size_t _entry_count; |
|
40 |
|
41 G1RedirtyCardsBufferList(); |
|
42 G1RedirtyCardsBufferList(BufferNode* head, BufferNode* tail, size_t entry_count); |
|
43 }; |
|
44 |
36 |
45 // Provide G1RedirtyCardsQueue with a thread-local qset. It provides an |
37 // Provide G1RedirtyCardsQueue with a thread-local qset. It provides an |
46 // uncontended staging area for completed buffers, to be flushed to the |
38 // uncontended staging area for completed buffers, to be flushed to the |
47 // shared qset en masse. Using the "base from member" idiom so the local |
39 // shared qset en masse. Using the "base from member" idiom so the local |
48 // qset is constructed before being passed to the PtrQueue constructor. |
40 // qset is constructed before being passed to the PtrQueue constructor. |
50 friend class G1RedirtyCardsQueue; |
42 friend class G1RedirtyCardsQueue; |
51 friend class G1RedirtyCardsQueueSet; |
43 friend class G1RedirtyCardsQueueSet; |
52 |
44 |
53 class LocalQSet : public PtrQueueSet { |
45 class LocalQSet : public PtrQueueSet { |
54 G1RedirtyCardsQueueSet* _shared_qset; |
46 G1RedirtyCardsQueueSet* _shared_qset; |
55 G1RedirtyCardsBufferList _buffers; |
47 G1BufferNodeList _buffers; |
56 |
48 |
57 public: |
49 public: |
58 LocalQSet(G1RedirtyCardsQueueSet* shared_qset); |
50 LocalQSet(G1RedirtyCardsQueueSet* shared_qset); |
59 ~LocalQSet(); |
51 ~LocalQSet(); |
60 |
52 |
62 virtual void enqueue_completed_buffer(BufferNode* node); |
54 virtual void enqueue_completed_buffer(BufferNode* node); |
63 |
55 |
64 // Transfer all completed buffers to the shared qset. |
56 // Transfer all completed buffers to the shared qset. |
65 void flush(); |
57 void flush(); |
66 |
58 |
67 G1RedirtyCardsBufferList take_all_completed_buffers(); |
59 G1BufferNodeList take_all_completed_buffers(); |
68 }; |
60 }; |
69 |
61 |
70 G1RedirtyCardsQueueBase(G1RedirtyCardsQueueSet* shared_qset) : |
62 G1RedirtyCardsQueueBase(G1RedirtyCardsQueueSet* shared_qset) : |
71 _local_qset(shared_qset) {} |
63 _local_qset(shared_qset) {} |
72 |
64 |
121 void merge_bufferlist(LocalQSet* src); |
113 void merge_bufferlist(LocalQSet* src); |
122 |
114 |
123 // Processing phase operations. |
115 // Processing phase operations. |
124 // precondition: Must not be concurrent with buffer collection. |
116 // precondition: Must not be concurrent with buffer collection. |
125 BufferNode* all_completed_buffers() const; |
117 BufferNode* all_completed_buffers() const; |
126 G1RedirtyCardsBufferList take_all_completed_buffers(); |
118 G1BufferNodeList take_all_completed_buffers(); |
127 }; |
119 }; |
128 |
120 |
129 #endif // SHARE_GC_G1_G1REDIRTYCARDSQUEUE_HPP |
121 #endif // SHARE_GC_G1_G1REDIRTYCARDSQUEUE_HPP |