src/share/vm/gc_implementation/g1/concurrentG1RefineThread.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 2314
f95d63e2154a
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, 2009, 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 // Forward Decl.
ysr@777 26 class ConcurrentG1Refine;
ysr@777 27
ysr@777 28 // The G1 Concurrent Refinement Thread (could be several in the future).
ysr@777 29
ysr@777 30 class ConcurrentG1RefineThread: public ConcurrentGCThread {
ysr@777 31 friend class VMStructs;
ysr@777 32 friend class G1CollectedHeap;
ysr@777 33
ysr@777 34 double _vtime_start; // Initial virtual time.
ysr@777 35 double _vtime_accum; // Initial virtual time.
iveresov@1229 36 int _worker_id;
iveresov@1230 37 int _worker_id_offset;
ysr@777 38
iveresov@1229 39 // The refinement threads collection is linked list. A predecessor can activate a successor
iveresov@1229 40 // when the number of the rset update buffer crosses a certain threshold. A successor
iveresov@1229 41 // would self-deactivate when the number of the buffers falls below the threshold.
iveresov@1229 42 bool _active;
iveresov@1546 43 ConcurrentG1RefineThread* _next;
iveresov@1546 44 Monitor* _monitor;
iveresov@1546 45 ConcurrentG1Refine* _cg1r;
ysr@777 46
iveresov@1546 47 int _thread_threshold_step;
iveresov@1546 48 // This thread activation threshold
iveresov@1546 49 int _threshold;
iveresov@1546 50 // This thread deactivation threshold
iveresov@1546 51 int _deactivation_threshold;
iveresov@1229 52
iveresov@1546 53 void sample_young_list_rs_lengths();
iveresov@1546 54 void run_young_rs_sampling();
iveresov@1546 55 void wait_for_completed_buffers();
ysr@777 56
iveresov@1546 57 void set_active(bool x) { _active = x; }
iveresov@1546 58 bool is_active();
iveresov@1546 59 void activate();
iveresov@1546 60 void deactivate();
ysr@777 61
ysr@777 62 // For use by G1CollectedHeap, which is a friend.
ysr@777 63 static SuspendibleThreadSet* sts() { return &_sts; }
ysr@777 64
iveresov@1546 65 public:
iveresov@1546 66 virtual void run();
ysr@777 67 // Constructor
iveresov@1230 68 ConcurrentG1RefineThread(ConcurrentG1Refine* cg1r, ConcurrentG1RefineThread* next,
iveresov@1230 69 int worker_id_offset, int worker_id);
ysr@777 70
iveresov@1546 71 void initialize();
iveresov@1546 72
ysr@777 73 // Printing
tonyp@1454 74 void print() const;
tonyp@1454 75 void print_on(outputStream* st) const;
ysr@777 76
ysr@777 77 // Total virtual time so far.
ysr@777 78 double vtime_accum() { return _vtime_accum; }
ysr@777 79
iveresov@1546 80 ConcurrentG1Refine* cg1r() { return _cg1r; }
ysr@777 81
ysr@777 82 // Yield for GC
iveresov@1546 83 void yield();
ysr@777 84 // shutdown
iveresov@1229 85 void stop();
ysr@777 86 };

mercurial