Sat, 06 Oct 2012 01:17:44 -0700
7127708: G1: change task num types from int to uint in concurrent mark
Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich.
Reviewed-by: johnc
Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
1 /*
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
28 #include "gc_implementation/g1/ptrQueue.hpp"
30 class ObjectClosure;
31 class JavaThread;
32 class SATBMarkQueueSet;
34 // A ptrQueue whose elements are "oops", pointers to object heads.
35 class ObjPtrQueue: public PtrQueue {
36 friend class SATBMarkQueueSet;
38 private:
39 // Filter out unwanted entries from the buffer.
40 void filter();
42 // Apply the closure to all elements.
43 void apply_closure(ObjectClosure* cl);
45 // Apply the closure to all elements and empty the buffer;
46 void apply_closure_and_empty(ObjectClosure* cl);
48 // Apply the closure to all elements of "buf", down to "index" (inclusive.)
49 static void apply_closure_to_buffer(ObjectClosure* cl,
50 void** buf, size_t index, size_t sz);
52 public:
53 ObjPtrQueue(PtrQueueSet* qset, bool perm = false) :
54 // SATB queues are only active during marking cycles. We create
55 // them with their active field set to false. If a thread is
56 // created during a cycle and its SATB queue needs to be activated
57 // before the thread starts running, we'll need to set its active
58 // field to true. This is done in JavaThread::initialize_queues().
59 PtrQueue(qset, perm, false /* active */) { }
61 // Overrides PtrQueue::flush() so that it can filter the buffer
62 // before it is flushed.
63 virtual void flush();
65 // Overrides PtrQueue::should_enqueue_buffer(). See the method's
66 // definition for more information.
67 virtual bool should_enqueue_buffer();
69 #ifndef PRODUCT
70 // Helpful for debugging
71 void print(const char* name);
72 static void print(const char* name, void** buf, size_t index, size_t sz);
73 #endif // PRODUCT
75 void verify_oops_in_buffer() NOT_DEBUG_RETURN;
76 };
78 class SATBMarkQueueSet: public PtrQueueSet {
79 ObjectClosure* _closure;
80 ObjectClosure** _par_closures; // One per ParGCThread.
82 ObjPtrQueue _shared_satb_queue;
84 // Utility function to support sequential and parallel versions. If
85 // "par" is true, then "worker" is the par thread id; if "false", worker
86 // is ignored.
87 bool apply_closure_to_completed_buffer_work(bool par, int worker);
89 #ifdef ASSERT
90 void dump_active_values(JavaThread* first, bool expected_active);
91 #endif // ASSERT
93 public:
94 SATBMarkQueueSet();
96 void initialize(Monitor* cbl_mon, Mutex* fl_lock,
97 int process_completed_threshold,
98 Mutex* lock);
100 static void handle_zero_index_for_thread(JavaThread* t);
102 // Apply "set_active(b)" to all Java threads' SATB queues. It should be
103 // called only with the world stopped. The method will assert that the
104 // SATB queues of all threads it visits, as well as the SATB queue
105 // set itself, has an active value same as expected_active.
106 void set_active_all_threads(bool b, bool expected_active);
108 // Filter all the currently-active SATB buffers.
109 void filter_thread_buffers();
111 // Register "blk" as "the closure" for all queues. Only one such closure
112 // is allowed. The "apply_closure_to_completed_buffer" method will apply
113 // this closure to a completed buffer, and "iterate_closure_all_threads"
114 // applies it to partially-filled buffers (the latter should only be done
115 // with the world stopped).
116 void set_closure(ObjectClosure* closure);
117 // Set the parallel closures: pointer is an array of pointers to
118 // closures, one for each parallel GC thread.
119 void set_par_closure(int i, ObjectClosure* closure);
121 // Apply the registered closure to all entries on each
122 // currently-active buffer and then empty the buffer. It should only
123 // be called serially and at a safepoint.
124 void iterate_closure_all_threads();
125 // Parallel version of the above.
126 void par_iterate_closure_all_threads(int worker);
128 // If there exists some completed buffer, pop it, then apply the
129 // registered closure to all its elements, and return true. If no
130 // completed buffers exist, return false.
131 bool apply_closure_to_completed_buffer() {
132 return apply_closure_to_completed_buffer_work(false, 0);
133 }
134 // Parallel version of the above.
135 bool par_apply_closure_to_completed_buffer(int worker) {
136 return apply_closure_to_completed_buffer_work(true, worker);
137 }
139 // Apply the given closure on enqueued and currently-active buffers
140 // respectively. Both methods are read-only, i.e., they do not
141 // modify any of the buffers.
142 void iterate_completed_buffers_read_only(ObjectClosure* cl);
143 void iterate_thread_buffers_read_only(ObjectClosure* cl);
145 #ifndef PRODUCT
146 // Helpful for debugging
147 void print_all(const char* msg);
148 #endif // PRODUCT
150 ObjPtrQueue* shared_satb_queue() { return &_shared_satb_queue; }
152 // If a marking is being abandoned, reset any unprocessed log buffers.
153 void abandon_partial_marking();
154 };
156 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP