Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/shared/concurrentGCThread.hpp @ 8733:9def4075da6d
8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
Summary: Update the task local finger to the start of the next object when marking aborts, in order to avoid the redundant scanning of all 0's when the marking task restarts, if otherwise updating to the next word. In addition, reuse the routine nextObject() in routine iterate().
Reviewed-by: johnc, ysr
Contributed-by: tamao <tao.mao@oracle.com>
author | tamao |
---|---|
date | Tue, 05 Mar 2013 15:36:56 -0800 |
parents | db9981fd3124 |
children | de6a9e811145 |
rev | line source |
---|---|
342 | 1 /* |
1972 | 2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. |
342 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
21 * questions. |
342 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_CONCURRENTGCTHREAD_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_SHARED_CONCURRENTGCTHREAD_HPP | |
27 | |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
3767
diff
changeset
|
28 #include "utilities/macros.hpp" |
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
3767
diff
changeset
|
29 #if INCLUDE_ALL_GCS |
1972 | 30 #include "runtime/thread.hpp" |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
3767
diff
changeset
|
31 #endif // INCLUDE_ALL_GCS |
1972 | 32 |
342 | 33 class VoidClosure; |
34 | |
35 // A SuspendibleThreadSet is (obviously) a set of threads that can be | |
36 // suspended. A thread can join and later leave the set, and periodically | |
37 // yield. If some thread (not in the set) requests, via suspend_all, that | |
38 // the threads be suspended, then the requesting thread is blocked until | |
39 // all the threads in the set have yielded or left the set. (Threads may | |
40 // not enter the set when an attempted suspension is in progress.) The | |
41 // suspending thread later calls resume_all, allowing the suspended threads | |
42 // to continue. | |
43 | |
44 class SuspendibleThreadSet { | |
45 Monitor* _m; | |
46 int _async; | |
47 bool _async_stop; | |
48 int _async_stopped; | |
49 bool _initialized; | |
50 double _suspend_all_start; | |
51 | |
52 void initialize_work(); | |
53 | |
54 public: | |
55 SuspendibleThreadSet() : _initialized(false) {} | |
56 | |
57 // Add the current thread to the set. May block if a suspension | |
58 // is in progress. | |
59 void join(); | |
60 // Removes the current thread from the set. | |
61 void leave(); | |
62 // Returns "true" iff an suspension is in progress. | |
63 bool should_yield() { return _async_stop; } | |
64 // Suspends the current thread if a suspension is in progress (for | |
65 // the duration of the suspension.) | |
66 void yield(const char* id); | |
67 // Return when all threads in the set are suspended. | |
68 void suspend_all(); | |
69 // Allow suspended threads to resume. | |
70 void resume_all(); | |
71 // Redundant initializations okay. | |
72 void initialize() { | |
73 // Double-check dirty read idiom. | |
74 if (!_initialized) initialize_work(); | |
75 } | |
76 }; | |
77 | |
78 | |
79 class ConcurrentGCThread: public NamedThread { | |
80 friend class VMStructs; | |
81 | |
82 protected: | |
794 | 83 bool _should_terminate; |
84 bool _has_terminated; | |
342 | 85 |
86 enum CGC_flag_type { | |
87 CGC_nil = 0x0, | |
88 CGC_dont_suspend = 0x1, | |
89 CGC_CGC_safepoint = 0x2, | |
90 CGC_VM_safepoint = 0x4 | |
91 }; | |
92 | |
93 static int _CGC_flag; | |
94 | |
95 static bool CGC_flag_is_set(int b) { return (_CGC_flag & b) != 0; } | |
96 static int set_CGC_flag(int b) { return _CGC_flag |= b; } | |
97 static int reset_CGC_flag(int b) { return _CGC_flag &= ~b; } | |
98 | |
99 // All instances share this one set. | |
100 static SuspendibleThreadSet _sts; | |
101 | |
102 // Create and start the thread (setting it's priority high.) | |
103 void create_and_start(); | |
104 | |
105 // Do initialization steps in the thread: record stack base and size, | |
106 // init thread local storage, set JNI handle block. | |
107 void initialize_in_thread(); | |
108 | |
109 // Wait until Universe::is_fully_initialized(); | |
110 void wait_for_universe_init(); | |
111 | |
112 // Record that the current thread is terminating, and will do more | |
113 // concurrent work. | |
114 void terminate(); | |
115 | |
116 public: | |
117 // Constructor | |
118 | |
119 ConcurrentGCThread(); | |
120 ~ConcurrentGCThread() {} // Exists to call NamedThread destructor. | |
121 | |
122 // Tester | |
123 bool is_ConcurrentGC_thread() const { return true; } | |
124 | |
125 static void safepoint_synchronize(); | |
126 static void safepoint_desynchronize(); | |
127 | |
128 // All overridings should probably do _sts::yield, but we allow | |
129 // overriding for distinguished debugging messages. Default is to do | |
130 // nothing. | |
131 virtual void yield() {} | |
132 | |
133 bool should_yield() { return _sts.should_yield(); } | |
134 | |
135 // they are prefixed by sts since there are already yield() and | |
136 // should_yield() (non-static) methods in this class and it was an | |
137 // easy way to differentiate them. | |
138 static void stsYield(const char* id); | |
139 static bool stsShouldYield(); | |
140 static void stsJoin(); | |
141 static void stsLeave(); | |
142 | |
143 }; | |
144 | |
145 // The SurrogateLockerThread is used by concurrent GC threads for | |
146 // manipulating Java monitors, in particular, currently for | |
147 // manipulating the pending_list_lock. XXX | |
148 class SurrogateLockerThread: public JavaThread { | |
149 friend class VMStructs; | |
150 public: | |
151 enum SLT_msg_type { | |
152 empty = 0, // no message | |
153 acquirePLL, // acquire pending list lock | |
154 releaseAndNotifyPLL // notify and release pending list lock | |
155 }; | |
156 private: | |
157 // the following are shared with the CMSThread | |
158 SLT_msg_type _buffer; // communication buffer | |
159 Monitor _monitor; // monitor controlling buffer | |
160 BasicLock _basicLock; // used for PLL locking | |
161 | |
162 public: | |
163 static SurrogateLockerThread* make(TRAPS); | |
164 | |
165 SurrogateLockerThread(); | |
166 | |
167 bool is_hidden_from_external_view() const { return true; } | |
168 | |
169 void loop(); // main method | |
170 | |
171 void manipulatePLL(SLT_msg_type msg); | |
172 | |
173 }; | |
1972 | 174 |
175 #endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_CONCURRENTGCTHREAD_HPP |