95
96 // Current buffer node used for parallel iteration.
97 BufferNode* volatile _cur_par_buffer_node;
98 public:
99 DirtyCardQueueSet(bool notify_when_complete = true);
100
101 void initialize(CardTableEntryClosure* cl,
102 Monitor* cbl_mon,
103 Mutex* fl_lock,
104 int process_completed_threshold,
105 int max_completed_queue,
106 Mutex* lock,
107 DirtyCardQueueSet* fl_owner = NULL);
108
109 // The number of parallel ids that can be claimed to allow collector or
110 // mutator threads to do card-processing work.
111 static uint num_par_ids();
112
113 static void handle_zero_index_for_thread(JavaThread* t);
114
115 // Apply the given closure to all entries in all currently-active buffers.
116 // This should only be applied at a safepoint. (Currently must not be called
117 // in parallel; this should change in the future.) If "consume" is true,
118 // processed entries are discarded.
119 void iterate_closure_all_threads(CardTableEntryClosure* cl,
120 bool consume = true,
121 uint worker_i = 0);
122
123 // If there exists some completed buffer, pop it, then apply the
124 // specified closure to all its elements, nulling out those elements
125 // processed. If all elements are processed, returns "true". If no
126 // completed buffers exist, returns false. If a completed buffer exists,
127 // but is only partially completed before a "yield" happens, the
128 // partially completed buffer (with its processed elements set to NULL)
129 // is returned to the completed buffer set, and this call returns false.
130 bool apply_closure_to_completed_buffer(CardTableEntryClosure* cl,
131 uint worker_i = 0,
132 int stop_at = 0,
133 bool during_pause = false);
134
135 // Helper routine for the above.
136 bool apply_closure_to_completed_buffer_helper(CardTableEntryClosure* cl,
137 uint worker_i,
138 BufferNode* nd);
139
140 BufferNode* get_completed_buffer(int stop_at);
141
142 // Applies the current closure to all completed buffers,
|
95
96 // Current buffer node used for parallel iteration.
97 BufferNode* volatile _cur_par_buffer_node;
98 public:
99 DirtyCardQueueSet(bool notify_when_complete = true);
100
101 void initialize(CardTableEntryClosure* cl,
102 Monitor* cbl_mon,
103 Mutex* fl_lock,
104 int process_completed_threshold,
105 int max_completed_queue,
106 Mutex* lock,
107 DirtyCardQueueSet* fl_owner = NULL);
108
109 // The number of parallel ids that can be claimed to allow collector or
110 // mutator threads to do card-processing work.
111 static uint num_par_ids();
112
113 static void handle_zero_index_for_thread(JavaThread* t);
114
115 // If there exists some completed buffer, pop it, then apply the
116 // specified closure to all its elements, nulling out those elements
117 // processed. If all elements are processed, returns "true". If no
118 // completed buffers exist, returns false. If a completed buffer exists,
119 // but is only partially completed before a "yield" happens, the
120 // partially completed buffer (with its processed elements set to NULL)
121 // is returned to the completed buffer set, and this call returns false.
122 bool apply_closure_to_completed_buffer(CardTableEntryClosure* cl,
123 uint worker_i = 0,
124 int stop_at = 0,
125 bool during_pause = false);
126
127 // Helper routine for the above.
128 bool apply_closure_to_completed_buffer_helper(CardTableEntryClosure* cl,
129 uint worker_i,
130 BufferNode* nd);
131
132 BufferNode* get_completed_buffer(int stop_at);
133
134 // Applies the current closure to all completed buffers,
|