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

Mon, 03 Aug 2009 12:59:30 -0700

author
johnc
date
Mon, 03 Aug 2009 12:59:30 -0700
changeset 1324
15c5903cf9e1
parent 1280
df6caf649ff7
child 1546
44f61c24ddab
permissions
-rw-r--r--

6865703: G1: Parallelize hot card cache cleanup
Summary: Have the GC worker threads clear the hot card cache in parallel by having each worker thread claim a chunk of the card cache and process the cards in that chunk. The size of the chunks that each thread will claim is determined at VM initialization from the size of the card cache and the number of worker threads.
Reviewed-by: jmasa, tonyp

ysr@777 1 /*
ysr@777 2 * Copyright 2001-2007 Sun Microsystems, Inc. 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 *
ysr@777 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
ysr@777 20 * CA 95054 USA or visit www.sun.com if you need additional information or
ysr@777 21 * have any 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) :
ysr@777 32 PtrQueue(qset_, perm)
ysr@777 33 {}
ysr@777 34 // Apply the closure to all elements, and reset the index to make the
ysr@777 35 // buffer empty.
ysr@777 36 void apply_closure(ObjectClosure* cl);
ysr@777 37
ysr@777 38 // Apply the closure to all elements of "buf", down to "index" (inclusive.)
ysr@777 39 static void apply_closure_to_buffer(ObjectClosure* cl,
ysr@777 40 void** buf, size_t index, size_t sz);
ysr@777 41
ysr@1280 42 void verify_oops_in_buffer() NOT_DEBUG_RETURN;
ysr@777 43 };
ysr@777 44
ysr@777 45
ysr@777 46
ysr@777 47 class SATBMarkQueueSet: public PtrQueueSet {
ysr@777 48 ObjectClosure* _closure;
ysr@777 49 ObjectClosure** _par_closures; // One per ParGCThread.
ysr@777 50
ysr@777 51 ObjPtrQueue _shared_satb_queue;
ysr@777 52
ysr@777 53 // Utility function to support sequential and parallel versions. If
ysr@777 54 // "par" is true, then "worker" is the par thread id; if "false", worker
ysr@777 55 // is ignored.
ysr@777 56 bool apply_closure_to_completed_buffer_work(bool par, int worker);
ysr@777 57
ysr@777 58
ysr@777 59 public:
ysr@777 60 SATBMarkQueueSet();
ysr@777 61
ysr@777 62 void initialize(Monitor* cbl_mon, Mutex* fl_lock,
ysr@777 63 int max_completed_queue = 0,
ysr@777 64 Mutex* lock = NULL);
ysr@777 65
ysr@777 66 static void handle_zero_index_for_thread(JavaThread* t);
ysr@777 67
ysr@777 68 // Apply "set_active(b)" to all thread tloq's. Should be called only
ysr@777 69 // with the world stopped.
ysr@777 70 void set_active_all_threads(bool b);
ysr@777 71
ysr@777 72 // Register "blk" as "the closure" for all queues. Only one such closure
ysr@777 73 // is allowed. The "apply_closure_to_completed_buffer" method will apply
ysr@777 74 // this closure to a completed buffer, and "iterate_closure_all_threads"
ysr@777 75 // applies it to partially-filled buffers (the latter should only be done
ysr@777 76 // with the world stopped).
ysr@777 77 void set_closure(ObjectClosure* closure);
ysr@777 78 // Set the parallel closures: pointer is an array of pointers to
ysr@777 79 // closures, one for each parallel GC thread.
ysr@777 80 void set_par_closure(int i, ObjectClosure* closure);
ysr@777 81
ysr@777 82 // If there is a registered closure for buffers, apply it to all entries
ysr@777 83 // in all currently-active buffers. This should only be applied at a
ysr@777 84 // safepoint. (Currently must not be called in parallel; this should
ysr@777 85 // change in the future.)
ysr@777 86 void iterate_closure_all_threads();
ysr@777 87 // Parallel version of the above.
ysr@777 88 void par_iterate_closure_all_threads(int worker);
ysr@777 89
ysr@777 90 // If there exists some completed buffer, pop it, then apply the
ysr@777 91 // registered closure to all its elements, and return true. If no
ysr@777 92 // completed buffers exist, return false.
ysr@777 93 bool apply_closure_to_completed_buffer() {
ysr@777 94 return apply_closure_to_completed_buffer_work(false, 0);
ysr@777 95 }
ysr@777 96 // Parallel version of the above.
ysr@777 97 bool par_apply_closure_to_completed_buffer(int worker) {
ysr@777 98 return apply_closure_to_completed_buffer_work(true, worker);
ysr@777 99 }
ysr@777 100
ysr@777 101 ObjPtrQueue* shared_satb_queue() { return &_shared_satb_queue; }
ysr@777 102
ysr@777 103 // If a marking is being abandoned, reset any unprocessed log buffers.
ysr@777 104 void abandon_partial_marking();
ysr@777 105
ysr@777 106 };

mercurial