src/share/vm/gc_implementation/g1/satbQueue.hpp

Mon, 02 Aug 2010 12:51:43 -0700

author
johnc
date
Mon, 02 Aug 2010 12:51:43 -0700
changeset 2060
2d160770d2e5
parent 1907
c18cbe5936b8
child 2197
6e0aac35bfa9
permissions
-rw-r--r--

6814437: G1: remove the _new_refs array
Summary: The per-worker _new_refs array is used to hold references that point into the collection set. It is populated during RSet updating and subsequently processed. In the event of an evacuation failure it processed again to recreate the RSets of regions in the collection set. Remove the per-worker _new_refs array by processing the references directly. Use a DirtyCardQueue to hold the cards containing the references so that the RSets of regions in the collection set can be recreated when handling an evacuation failure.
Reviewed-by: iveresov, jmasa, tonyp

ysr@777 1 /*
trims@1907 2 * Copyright (c) 2001, 2007, Oracle and/or its affiliates. All rights reserved.
ysr@777 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@777 4 *
ysr@777 5 * This code is free software; you can redistribute it and/or modify it
ysr@777 6 * under the terms of the GNU General Public License version 2 only, as
ysr@777 7 * published by the Free Software Foundation.
ysr@777 8 *
ysr@777 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@777 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@777 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@777 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@777 13 * accompanied this code).
ysr@777 14 *
ysr@777 15 * You should have received a copy of the GNU General Public License version
ysr@777 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@777 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@777 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
ysr@777 25 class ObjectClosure;
ysr@777 26 class JavaThread;
ysr@777 27
ysr@777 28 // A ptrQueue whose elements are "oops", pointers to object heads.
ysr@777 29 class ObjPtrQueue: public PtrQueue {
ysr@777 30 public:
ysr@777 31 ObjPtrQueue(PtrQueueSet* qset_, bool perm = false) :
tonyp@1752 32 PtrQueue(qset_, perm, qset_->is_active()) { }
ysr@777 33 // Apply the closure to all elements, and reset the index to make the
ysr@777 34 // buffer empty.
ysr@777 35 void apply_closure(ObjectClosure* cl);
ysr@777 36
ysr@777 37 // Apply the closure to all elements of "buf", down to "index" (inclusive.)
ysr@777 38 static void apply_closure_to_buffer(ObjectClosure* cl,
ysr@777 39 void** buf, size_t index, size_t sz);
ysr@777 40
ysr@1280 41 void verify_oops_in_buffer() NOT_DEBUG_RETURN;
ysr@777 42 };
ysr@777 43
ysr@777 44
ysr@777 45
ysr@777 46 class SATBMarkQueueSet: public PtrQueueSet {
ysr@777 47 ObjectClosure* _closure;
ysr@777 48 ObjectClosure** _par_closures; // One per ParGCThread.
ysr@777 49
ysr@777 50 ObjPtrQueue _shared_satb_queue;
ysr@777 51
ysr@777 52 // Utility function to support sequential and parallel versions. If
ysr@777 53 // "par" is true, then "worker" is the par thread id; if "false", worker
ysr@777 54 // is ignored.
ysr@777 55 bool apply_closure_to_completed_buffer_work(bool par, int worker);
ysr@777 56
tonyp@1752 57 #ifdef ASSERT
tonyp@1752 58 void dump_active_values(JavaThread* first, bool expected_active);
tonyp@1752 59 #endif // ASSERT
ysr@777 60
ysr@777 61 public:
ysr@777 62 SATBMarkQueueSet();
ysr@777 63
ysr@777 64 void initialize(Monitor* cbl_mon, Mutex* fl_lock,
iveresov@1546 65 int process_completed_threshold,
iveresov@1546 66 Mutex* lock);
ysr@777 67
ysr@777 68 static void handle_zero_index_for_thread(JavaThread* t);
ysr@777 69
tonyp@1752 70 // Apply "set_active(b)" to all Java threads' SATB queues. It should be
tonyp@1752 71 // called only with the world stopped. The method will assert that the
tonyp@1752 72 // SATB queues of all threads it visits, as well as the SATB queue
tonyp@1752 73 // set itself, has an active value same as expected_active.
tonyp@1752 74 void set_active_all_threads(bool b, bool expected_active);
ysr@777 75
ysr@777 76 // Register "blk" as "the closure" for all queues. Only one such closure
ysr@777 77 // is allowed. The "apply_closure_to_completed_buffer" method will apply
ysr@777 78 // this closure to a completed buffer, and "iterate_closure_all_threads"
ysr@777 79 // applies it to partially-filled buffers (the latter should only be done
ysr@777 80 // with the world stopped).
ysr@777 81 void set_closure(ObjectClosure* closure);
ysr@777 82 // Set the parallel closures: pointer is an array of pointers to
ysr@777 83 // closures, one for each parallel GC thread.
ysr@777 84 void set_par_closure(int i, ObjectClosure* closure);
ysr@777 85
ysr@777 86 // If there is a registered closure for buffers, apply it to all entries
ysr@777 87 // in all currently-active buffers. This should only be applied at a
ysr@777 88 // safepoint. (Currently must not be called in parallel; this should
ysr@777 89 // change in the future.)
ysr@777 90 void iterate_closure_all_threads();
ysr@777 91 // Parallel version of the above.
ysr@777 92 void par_iterate_closure_all_threads(int worker);
ysr@777 93
ysr@777 94 // If there exists some completed buffer, pop it, then apply the
ysr@777 95 // registered closure to all its elements, and return true. If no
ysr@777 96 // completed buffers exist, return false.
ysr@777 97 bool apply_closure_to_completed_buffer() {
ysr@777 98 return apply_closure_to_completed_buffer_work(false, 0);
ysr@777 99 }
ysr@777 100 // Parallel version of the above.
ysr@777 101 bool par_apply_closure_to_completed_buffer(int worker) {
ysr@777 102 return apply_closure_to_completed_buffer_work(true, worker);
ysr@777 103 }
ysr@777 104
ysr@777 105 ObjPtrQueue* shared_satb_queue() { return &_shared_satb_queue; }
ysr@777 106
ysr@777 107 // If a marking is being abandoned, reset any unprocessed log buffers.
ysr@777 108 void abandon_partial_marking();
ysr@777 109
ysr@777 110 };

mercurial