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

Thu, 22 Sep 2011 10:57:37 -0700

author
johnc
date
Thu, 22 Sep 2011 10:57:37 -0700
changeset 3175
4dfb2df418f2
parent 2469
7e37af9d69ef
child 3416
2ace1c4ee8da
permissions
-rw-r--r--

6484982: G1: process references during evacuation pauses
Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate.
Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp

ysr@777 1 /*
tonyp@2469 2 * Copyright (c) 2001, 2011, 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
stefank@2314 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
stefank@2314 27
stefank@2314 28 #include "gc_implementation/g1/ptrQueue.hpp"
stefank@2314 29
ysr@777 30 class ObjectClosure;
ysr@777 31 class JavaThread;
ysr@777 32
ysr@777 33 // A ptrQueue whose elements are "oops", pointers to object heads.
ysr@777 34 class ObjPtrQueue: public PtrQueue {
ysr@777 35 public:
tonyp@2469 36 ObjPtrQueue(PtrQueueSet* qset, bool perm = false) :
tonyp@2197 37 // SATB queues are only active during marking cycles. We create
tonyp@2197 38 // them with their active field set to false. If a thread is
tonyp@2197 39 // created during a cycle and its SATB queue needs to be activated
tonyp@2197 40 // before the thread starts running, we'll need to set its active
tonyp@2197 41 // field to true. This is done in JavaThread::initialize_queues().
tonyp@2469 42 PtrQueue(qset, perm, false /* active */) { }
tonyp@2469 43
tonyp@2469 44 // Overrides PtrQueue::should_enqueue_buffer(). See the method's
tonyp@2469 45 // definition for more information.
tonyp@2469 46 virtual bool should_enqueue_buffer();
tonyp@2469 47
ysr@777 48 // Apply the closure to all elements, and reset the index to make the
ysr@777 49 // buffer empty.
ysr@777 50 void apply_closure(ObjectClosure* cl);
ysr@777 51
ysr@777 52 // Apply the closure to all elements of "buf", down to "index" (inclusive.)
ysr@777 53 static void apply_closure_to_buffer(ObjectClosure* cl,
ysr@777 54 void** buf, size_t index, size_t sz);
ysr@777 55
ysr@1280 56 void verify_oops_in_buffer() NOT_DEBUG_RETURN;
ysr@777 57 };
ysr@777 58
ysr@777 59
ysr@777 60
ysr@777 61 class SATBMarkQueueSet: public PtrQueueSet {
ysr@777 62 ObjectClosure* _closure;
ysr@777 63 ObjectClosure** _par_closures; // One per ParGCThread.
ysr@777 64
ysr@777 65 ObjPtrQueue _shared_satb_queue;
ysr@777 66
ysr@777 67 // Utility function to support sequential and parallel versions. If
ysr@777 68 // "par" is true, then "worker" is the par thread id; if "false", worker
ysr@777 69 // is ignored.
ysr@777 70 bool apply_closure_to_completed_buffer_work(bool par, int worker);
ysr@777 71
tonyp@1752 72 #ifdef ASSERT
tonyp@1752 73 void dump_active_values(JavaThread* first, bool expected_active);
tonyp@1752 74 #endif // ASSERT
ysr@777 75
ysr@777 76 public:
ysr@777 77 SATBMarkQueueSet();
ysr@777 78
ysr@777 79 void initialize(Monitor* cbl_mon, Mutex* fl_lock,
iveresov@1546 80 int process_completed_threshold,
iveresov@1546 81 Mutex* lock);
ysr@777 82
ysr@777 83 static void handle_zero_index_for_thread(JavaThread* t);
ysr@777 84
tonyp@1752 85 // Apply "set_active(b)" to all Java threads' SATB queues. It should be
tonyp@1752 86 // called only with the world stopped. The method will assert that the
tonyp@1752 87 // SATB queues of all threads it visits, as well as the SATB queue
tonyp@1752 88 // set itself, has an active value same as expected_active.
tonyp@1752 89 void set_active_all_threads(bool b, bool expected_active);
ysr@777 90
ysr@777 91 // Register "blk" as "the closure" for all queues. Only one such closure
ysr@777 92 // is allowed. The "apply_closure_to_completed_buffer" method will apply
ysr@777 93 // this closure to a completed buffer, and "iterate_closure_all_threads"
ysr@777 94 // applies it to partially-filled buffers (the latter should only be done
ysr@777 95 // with the world stopped).
ysr@777 96 void set_closure(ObjectClosure* closure);
ysr@777 97 // Set the parallel closures: pointer is an array of pointers to
ysr@777 98 // closures, one for each parallel GC thread.
ysr@777 99 void set_par_closure(int i, ObjectClosure* closure);
ysr@777 100
ysr@777 101 // If there is a registered closure for buffers, apply it to all entries
ysr@777 102 // in all currently-active buffers. This should only be applied at a
ysr@777 103 // safepoint. (Currently must not be called in parallel; this should
ysr@777 104 // change in the future.)
ysr@777 105 void iterate_closure_all_threads();
ysr@777 106 // Parallel version of the above.
ysr@777 107 void par_iterate_closure_all_threads(int worker);
ysr@777 108
ysr@777 109 // If there exists some completed buffer, pop it, then apply the
ysr@777 110 // registered closure to all its elements, and return true. If no
ysr@777 111 // completed buffers exist, return false.
ysr@777 112 bool apply_closure_to_completed_buffer() {
ysr@777 113 return apply_closure_to_completed_buffer_work(false, 0);
ysr@777 114 }
ysr@777 115 // Parallel version of the above.
ysr@777 116 bool par_apply_closure_to_completed_buffer(int worker) {
ysr@777 117 return apply_closure_to_completed_buffer_work(true, worker);
ysr@777 118 }
ysr@777 119
ysr@777 120 ObjPtrQueue* shared_satb_queue() { return &_shared_satb_queue; }
ysr@777 121
ysr@777 122 // If a marking is being abandoned, reset any unprocessed log buffers.
ysr@777 123 void abandon_partial_marking();
ysr@777 124
ysr@777 125 };
stefank@2314 126
stefank@2314 127 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP

mercurial