src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp

Wed, 23 Sep 2009 23:56:15 -0700

author
jrose
date
Wed, 23 Sep 2009 23:56:15 -0700
changeset 1428
54b3b351d6f9
parent 1424
148e5441d916
parent 1376
8b46c4d82093
child 1429
753cf9794df9
permissions
-rw-r--r--

Merge

duke@435 1 /*
duke@435 2 * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
duke@435 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 20 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 21 * have any questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 /////////////////////////////////////////////////////////////////
duke@435 26 // Closures used by ConcurrentMarkSweepGeneration's collector
duke@435 27 /////////////////////////////////////////////////////////////////
duke@435 28 class ConcurrentMarkSweepGeneration;
duke@435 29 class CMSBitMap;
duke@435 30 class CMSMarkStack;
duke@435 31 class CMSCollector;
duke@435 32 class MarkFromRootsClosure;
duke@435 33 class Par_MarkFromRootsClosure;
duke@435 34
coleenp@548 35 // Decode the oop and call do_oop on it.
coleenp@548 36 #define DO_OOP_WORK_DEFN \
coleenp@548 37 void do_oop(oop obj); \
coleenp@548 38 template <class T> inline void do_oop_work(T* p) { \
coleenp@548 39 T heap_oop = oopDesc::load_heap_oop(p); \
coleenp@548 40 if (!oopDesc::is_null(heap_oop)) { \
coleenp@548 41 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); \
coleenp@548 42 do_oop(obj); \
coleenp@548 43 } \
coleenp@548 44 }
coleenp@548 45
duke@435 46 class MarkRefsIntoClosure: public OopsInGenClosure {
coleenp@548 47 private:
coleenp@548 48 const MemRegion _span;
coleenp@548 49 CMSBitMap* _bitMap;
coleenp@548 50 const bool _should_do_nmethods;
coleenp@548 51 protected:
coleenp@548 52 DO_OOP_WORK_DEFN
duke@435 53 public:
duke@435 54 MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap,
duke@435 55 bool should_do_nmethods);
jrose@1424 56 bool should_do_nmethods() { return _should_do_nmethods; }
coleenp@548 57 virtual void do_oop(oop* p);
coleenp@548 58 virtual void do_oop(narrowOop* p);
coleenp@548 59 inline void do_oop_nv(oop* p) { MarkRefsIntoClosure::do_oop_work(p); }
coleenp@548 60 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); }
duke@435 61 bool do_header() { return true; }
duke@435 62 Prefetch::style prefetch_style() {
duke@435 63 return Prefetch::do_read;
duke@435 64 }
duke@435 65 };
duke@435 66
duke@435 67 // A variant of the above used in certain kinds of CMS
duke@435 68 // marking verification.
duke@435 69 class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
coleenp@548 70 private:
coleenp@548 71 const MemRegion _span;
coleenp@548 72 CMSBitMap* _verification_bm;
coleenp@548 73 CMSBitMap* _cms_bm;
coleenp@548 74 const bool _should_do_nmethods;
coleenp@548 75 protected:
coleenp@548 76 DO_OOP_WORK_DEFN
duke@435 77 public:
duke@435 78 MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
duke@435 79 CMSBitMap* cms_bm, bool should_do_nmethods);
jrose@1424 80 bool should_do_nmethods() { return _should_do_nmethods; }
coleenp@548 81 virtual void do_oop(oop* p);
coleenp@548 82 virtual void do_oop(narrowOop* p);
coleenp@548 83 inline void do_oop_nv(oop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
coleenp@548 84 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
duke@435 85 bool do_header() { return true; }
duke@435 86 Prefetch::style prefetch_style() {
duke@435 87 return Prefetch::do_read;
duke@435 88 }
duke@435 89 };
duke@435 90
jmasa@1370 91 // KlassRememberingOopClosure is used when marking of the permanent generation
jmasa@1370 92 // is being done. It adds fields to support revisiting of klasses
jmasa@1370 93 // for class unloading. _should_remember_klasses should be set to
jmasa@1370 94 // indicate if klasses should be remembered. Currently that is whenever
jmasa@1370 95 // CMS class unloading is turned on. The _revisit_stack is used
jmasa@1370 96 // to save the klasses for later processing.
jmasa@1370 97 class KlassRememberingOopClosure : public OopClosure {
jmasa@1370 98 protected:
jmasa@1370 99 CMSCollector* _collector;
jmasa@1370 100 CMSMarkStack* _revisit_stack;
jmasa@1370 101 bool const _should_remember_klasses;
jmasa@1370 102 public:
jmasa@1370 103 void check_remember_klasses() const PRODUCT_RETURN;
jmasa@1370 104 virtual const bool should_remember_klasses() const {
jmasa@1370 105 check_remember_klasses();
jmasa@1370 106 return _should_remember_klasses;
jmasa@1370 107 }
jmasa@1370 108 virtual void remember_klass(Klass* k);
jmasa@1370 109
jmasa@1370 110 KlassRememberingOopClosure(CMSCollector* collector,
jmasa@1370 111 ReferenceProcessor* rp,
jmasa@1370 112 CMSMarkStack* revisit_stack);
jmasa@1370 113 };
jmasa@1370 114
jmasa@1370 115 // Similar to KlassRememberingOopClosure for use when multiple
jmasa@1370 116 // GC threads will execute the closure.
jmasa@1370 117
jmasa@1370 118 class Par_KlassRememberingOopClosure : public KlassRememberingOopClosure {
jmasa@1370 119 public:
jmasa@1370 120 Par_KlassRememberingOopClosure(CMSCollector* collector,
jmasa@1370 121 ReferenceProcessor* rp,
jmasa@1370 122 CMSMarkStack* revisit_stack):
jmasa@1370 123 KlassRememberingOopClosure(collector, rp, revisit_stack) {}
jmasa@1370 124 virtual void remember_klass(Klass* k);
jmasa@1370 125 };
jmasa@1370 126
duke@435 127 // The non-parallel version (the parallel version appears further below).
jmasa@1370 128 class PushAndMarkClosure: public KlassRememberingOopClosure {
coleenp@548 129 private:
coleenp@548 130 MemRegion _span;
coleenp@548 131 CMSBitMap* _bit_map;
coleenp@548 132 CMSBitMap* _mod_union_table;
coleenp@548 133 CMSMarkStack* _mark_stack;
coleenp@548 134 bool _concurrent_precleaning;
coleenp@548 135 protected:
coleenp@548 136 DO_OOP_WORK_DEFN
duke@435 137 public:
duke@435 138 PushAndMarkClosure(CMSCollector* collector,
duke@435 139 MemRegion span,
duke@435 140 ReferenceProcessor* rp,
duke@435 141 CMSBitMap* bit_map,
duke@435 142 CMSBitMap* mod_union_table,
coleenp@548 143 CMSMarkStack* mark_stack,
coleenp@548 144 CMSMarkStack* revisit_stack,
coleenp@548 145 bool concurrent_precleaning);
coleenp@548 146 virtual void do_oop(oop* p);
coleenp@548 147 virtual void do_oop(narrowOop* p);
coleenp@548 148 inline void do_oop_nv(oop* p) { PushAndMarkClosure::do_oop_work(p); }
coleenp@548 149 inline void do_oop_nv(narrowOop* p) { PushAndMarkClosure::do_oop_work(p); }
duke@435 150 bool do_header() { return true; }
duke@435 151 Prefetch::style prefetch_style() {
duke@435 152 return Prefetch::do_read;
duke@435 153 }
ysr@1376 154 // In support of class unloading
ysr@1376 155 virtual const bool should_remember_mdo() const {
ysr@1376 156 return false;
ysr@1376 157 // return _should_remember_klasses;
ysr@1376 158 }
ysr@1376 159 virtual void remember_mdo(DataLayout* v);
duke@435 160 };
duke@435 161
duke@435 162 // In the parallel case, the revisit stack, the bit map and the
duke@435 163 // reference processor are currently all shared. Access to
duke@435 164 // these shared mutable structures must use appropriate
duke@435 165 // synchronization (for instance, via CAS). The marking stack
duke@435 166 // used in the non-parallel case above is here replaced with
duke@435 167 // an OopTaskQueue structure to allow efficient work stealing.
jmasa@1370 168 class Par_PushAndMarkClosure: public Par_KlassRememberingOopClosure {
coleenp@548 169 private:
coleenp@548 170 MemRegion _span;
coleenp@548 171 CMSBitMap* _bit_map;
coleenp@548 172 OopTaskQueue* _work_queue;
coleenp@548 173 protected:
coleenp@548 174 DO_OOP_WORK_DEFN
duke@435 175 public:
duke@435 176 Par_PushAndMarkClosure(CMSCollector* collector,
duke@435 177 MemRegion span,
duke@435 178 ReferenceProcessor* rp,
duke@435 179 CMSBitMap* bit_map,
duke@435 180 OopTaskQueue* work_queue,
duke@435 181 CMSMarkStack* revisit_stack);
coleenp@548 182 virtual void do_oop(oop* p);
coleenp@548 183 virtual void do_oop(narrowOop* p);
coleenp@548 184 inline void do_oop_nv(oop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
coleenp@548 185 inline void do_oop_nv(narrowOop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
duke@435 186 bool do_header() { return true; }
duke@435 187 Prefetch::style prefetch_style() {
duke@435 188 return Prefetch::do_read;
duke@435 189 }
ysr@1376 190 // In support of class unloading
ysr@1376 191 virtual const bool should_remember_mdo() const {
ysr@1376 192 return false;
ysr@1376 193 // return _should_remember_klasses;
ysr@1376 194 }
ysr@1376 195 virtual void remember_mdo(DataLayout* v);
duke@435 196 };
duke@435 197
duke@435 198 // The non-parallel version (the parallel version appears further below).
duke@435 199 class MarkRefsIntoAndScanClosure: public OopsInGenClosure {
coleenp@548 200 private:
coleenp@548 201 MemRegion _span;
coleenp@548 202 CMSBitMap* _bit_map;
coleenp@548 203 CMSMarkStack* _mark_stack;
coleenp@548 204 PushAndMarkClosure _pushAndMarkClosure;
coleenp@548 205 CMSCollector* _collector;
coleenp@548 206 Mutex* _freelistLock;
coleenp@548 207 bool _yield;
duke@435 208 // Whether closure is being used for concurrent precleaning
coleenp@548 209 bool _concurrent_precleaning;
coleenp@548 210 protected:
coleenp@548 211 DO_OOP_WORK_DEFN
duke@435 212 public:
duke@435 213 MarkRefsIntoAndScanClosure(MemRegion span,
duke@435 214 ReferenceProcessor* rp,
duke@435 215 CMSBitMap* bit_map,
duke@435 216 CMSBitMap* mod_union_table,
coleenp@548 217 CMSMarkStack* mark_stack,
coleenp@548 218 CMSMarkStack* revisit_stack,
duke@435 219 CMSCollector* collector,
duke@435 220 bool should_yield,
duke@435 221 bool concurrent_precleaning);
coleenp@548 222 virtual void do_oop(oop* p);
coleenp@548 223 virtual void do_oop(narrowOop* p);
coleenp@548 224 inline void do_oop_nv(oop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
coleenp@548 225 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
duke@435 226 bool do_header() { return true; }
duke@435 227 Prefetch::style prefetch_style() {
duke@435 228 return Prefetch::do_read;
duke@435 229 }
duke@435 230 void set_freelistLock(Mutex* m) {
duke@435 231 _freelistLock = m;
duke@435 232 }
jmasa@1370 233 virtual const bool should_remember_klasses() const {
jmasa@1370 234 return _pushAndMarkClosure.should_remember_klasses();
jmasa@1370 235 }
jmasa@1370 236 virtual void remember_klass(Klass* k) {
jmasa@1370 237 _pushAndMarkClosure.remember_klass(k);
jmasa@1370 238 }
duke@435 239
duke@435 240 private:
duke@435 241 inline void do_yield_check();
duke@435 242 void do_yield_work();
duke@435 243 bool take_from_overflow_list();
duke@435 244 };
duke@435 245
duke@435 246 // Tn this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
duke@435 247 // stack and the bitMap are shared, so access needs to be suitably
duke@435 248 // sycnhronized. An OopTaskQueue structure, supporting efficient
duke@435 249 // workstealing, replaces a CMSMarkStack for storing grey objects.
duke@435 250 class Par_MarkRefsIntoAndScanClosure: public OopsInGenClosure {
coleenp@548 251 private:
coleenp@548 252 MemRegion _span;
coleenp@548 253 CMSBitMap* _bit_map;
coleenp@548 254 OopTaskQueue* _work_queue;
coleenp@548 255 const uint _low_water_mark;
coleenp@548 256 Par_PushAndMarkClosure _par_pushAndMarkClosure;
coleenp@548 257 protected:
coleenp@548 258 DO_OOP_WORK_DEFN
duke@435 259 public:
duke@435 260 Par_MarkRefsIntoAndScanClosure(CMSCollector* collector,
duke@435 261 MemRegion span,
duke@435 262 ReferenceProcessor* rp,
duke@435 263 CMSBitMap* bit_map,
duke@435 264 OopTaskQueue* work_queue,
duke@435 265 CMSMarkStack* revisit_stack);
coleenp@548 266 virtual void do_oop(oop* p);
coleenp@548 267 virtual void do_oop(narrowOop* p);
coleenp@548 268 inline void do_oop_nv(oop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
coleenp@548 269 inline void do_oop_nv(narrowOop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
duke@435 270 bool do_header() { return true; }
duke@435 271 virtual const bool do_nmethods() const { return true; }
jmasa@1370 272 // When ScanMarkedObjectsAgainClosure is used,
jmasa@1370 273 // it passes [Par_]MarkRefsIntoAndScanClosure to oop_oop_iterate(),
jmasa@1370 274 // and this delegation is used.
jmasa@1370 275 virtual const bool should_remember_klasses() const {
jmasa@1370 276 return _par_pushAndMarkClosure.should_remember_klasses();
jmasa@1370 277 }
jmasa@1370 278 // See comment on should_remember_klasses() above.
jmasa@1370 279 virtual void remember_klass(Klass* k) {
jmasa@1370 280 _par_pushAndMarkClosure.remember_klass(k);
jmasa@1370 281 }
duke@435 282 Prefetch::style prefetch_style() {
duke@435 283 return Prefetch::do_read;
duke@435 284 }
duke@435 285 void trim_queue(uint size);
duke@435 286 };
duke@435 287
duke@435 288 // This closure is used during the concurrent marking phase
duke@435 289 // following the first checkpoint. Its use is buried in
duke@435 290 // the closure MarkFromRootsClosure.
jmasa@1370 291 class PushOrMarkClosure: public KlassRememberingOopClosure {
coleenp@548 292 private:
coleenp@548 293 MemRegion _span;
coleenp@548 294 CMSBitMap* _bitMap;
coleenp@548 295 CMSMarkStack* _markStack;
coleenp@548 296 HeapWord* const _finger;
coleenp@548 297 MarkFromRootsClosure* const
coleenp@548 298 _parent;
coleenp@548 299 protected:
coleenp@548 300 DO_OOP_WORK_DEFN
duke@435 301 public:
duke@435 302 PushOrMarkClosure(CMSCollector* cms_collector,
duke@435 303 MemRegion span,
duke@435 304 CMSBitMap* bitMap,
coleenp@548 305 CMSMarkStack* markStack,
coleenp@548 306 CMSMarkStack* revisitStack,
coleenp@548 307 HeapWord* finger,
duke@435 308 MarkFromRootsClosure* parent);
coleenp@548 309 virtual void do_oop(oop* p);
coleenp@548 310 virtual void do_oop(narrowOop* p);
coleenp@548 311 inline void do_oop_nv(oop* p) { PushOrMarkClosure::do_oop_work(p); }
coleenp@548 312 inline void do_oop_nv(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); }
ysr@1376 313 // In support of class unloading
ysr@1376 314 virtual const bool should_remember_mdo() const {
ysr@1376 315 return false;
ysr@1376 316 // return _should_remember_klasses;
ysr@1376 317 }
ysr@1376 318 virtual void remember_mdo(DataLayout* v);
ysr@1376 319
duke@435 320 // Deal with a stack overflow condition
duke@435 321 void handle_stack_overflow(HeapWord* lost);
duke@435 322 private:
duke@435 323 inline void do_yield_check();
duke@435 324 };
duke@435 325
duke@435 326 // A parallel (MT) version of the above.
duke@435 327 // This closure is used during the concurrent marking phase
duke@435 328 // following the first checkpoint. Its use is buried in
duke@435 329 // the closure Par_MarkFromRootsClosure.
jmasa@1370 330 class Par_PushOrMarkClosure: public Par_KlassRememberingOopClosure {
coleenp@548 331 private:
duke@435 332 MemRegion _whole_span;
duke@435 333 MemRegion _span; // local chunk
duke@435 334 CMSBitMap* _bit_map;
duke@435 335 OopTaskQueue* _work_queue;
duke@435 336 CMSMarkStack* _overflow_stack;
duke@435 337 HeapWord* const _finger;
duke@435 338 HeapWord** const _global_finger_addr;
coleenp@548 339 Par_MarkFromRootsClosure* const
coleenp@548 340 _parent;
coleenp@548 341 protected:
coleenp@548 342 DO_OOP_WORK_DEFN
duke@435 343 public:
duke@435 344 Par_PushOrMarkClosure(CMSCollector* cms_collector,
coleenp@548 345 MemRegion span,
coleenp@548 346 CMSBitMap* bit_map,
coleenp@548 347 OopTaskQueue* work_queue,
coleenp@548 348 CMSMarkStack* mark_stack,
coleenp@548 349 CMSMarkStack* revisit_stack,
coleenp@548 350 HeapWord* finger,
coleenp@548 351 HeapWord** global_finger_addr,
coleenp@548 352 Par_MarkFromRootsClosure* parent);
coleenp@548 353 virtual void do_oop(oop* p);
coleenp@548 354 virtual void do_oop(narrowOop* p);
coleenp@548 355 inline void do_oop_nv(oop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
coleenp@548 356 inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
ysr@1376 357 // In support of class unloading
ysr@1376 358 virtual const bool should_remember_mdo() const {
ysr@1376 359 return false;
ysr@1376 360 // return _should_remember_klasses;
ysr@1376 361 }
ysr@1376 362 virtual void remember_mdo(DataLayout* v);
ysr@1376 363
duke@435 364 // Deal with a stack overflow condition
duke@435 365 void handle_stack_overflow(HeapWord* lost);
duke@435 366 private:
duke@435 367 inline void do_yield_check();
duke@435 368 };
duke@435 369
duke@435 370 // For objects in CMS generation, this closure marks
duke@435 371 // given objects (transitively) as being reachable/live.
duke@435 372 // This is currently used during the (weak) reference object
ysr@887 373 // processing phase of the CMS final checkpoint step, as
ysr@887 374 // well as during the concurrent precleaning of the discovered
ysr@887 375 // reference lists.
jmasa@1370 376 class CMSKeepAliveClosure: public KlassRememberingOopClosure {
coleenp@548 377 private:
ysr@578 378 const MemRegion _span;
duke@435 379 CMSMarkStack* _mark_stack;
duke@435 380 CMSBitMap* _bit_map;
ysr@887 381 bool _concurrent_precleaning;
coleenp@548 382 protected:
coleenp@548 383 DO_OOP_WORK_DEFN
duke@435 384 public:
duke@435 385 CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
ysr@887 386 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
jmasa@1370 387 CMSMarkStack* revisit_stack, bool cpc);
ysr@887 388 bool concurrent_precleaning() const { return _concurrent_precleaning; }
coleenp@548 389 virtual void do_oop(oop* p);
coleenp@548 390 virtual void do_oop(narrowOop* p);
coleenp@548 391 inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); }
coleenp@548 392 inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
duke@435 393 };
duke@435 394
jmasa@1370 395 class CMSInnerParMarkAndPushClosure: public Par_KlassRememberingOopClosure {
coleenp@548 396 private:
duke@435 397 MemRegion _span;
duke@435 398 OopTaskQueue* _work_queue;
duke@435 399 CMSBitMap* _bit_map;
coleenp@548 400 protected:
coleenp@548 401 DO_OOP_WORK_DEFN
duke@435 402 public:
duke@435 403 CMSInnerParMarkAndPushClosure(CMSCollector* collector,
duke@435 404 MemRegion span, CMSBitMap* bit_map,
jmasa@1370 405 CMSMarkStack* revisit_stack,
jmasa@1370 406 OopTaskQueue* work_queue);
coleenp@548 407 virtual void do_oop(oop* p);
coleenp@548 408 virtual void do_oop(narrowOop* p);
coleenp@548 409 inline void do_oop_nv(oop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
coleenp@548 410 inline void do_oop_nv(narrowOop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
duke@435 411 };
duke@435 412
duke@435 413 // A parallel (MT) version of the above, used when
duke@435 414 // reference processing is parallel; the only difference
duke@435 415 // is in the do_oop method.
jmasa@1370 416 class CMSParKeepAliveClosure: public Par_KlassRememberingOopClosure {
coleenp@548 417 private:
duke@435 418 MemRegion _span;
duke@435 419 OopTaskQueue* _work_queue;
duke@435 420 CMSBitMap* _bit_map;
coleenp@548 421 CMSInnerParMarkAndPushClosure
coleenp@548 422 _mark_and_push;
duke@435 423 const uint _low_water_mark;
duke@435 424 void trim_queue(uint max);
coleenp@548 425 protected:
coleenp@548 426 DO_OOP_WORK_DEFN
duke@435 427 public:
duke@435 428 CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
jmasa@1370 429 CMSBitMap* bit_map, CMSMarkStack* revisit_stack,
jmasa@1370 430 OopTaskQueue* work_queue);
coleenp@548 431 virtual void do_oop(oop* p);
coleenp@548 432 virtual void do_oop(narrowOop* p);
coleenp@548 433 inline void do_oop_nv(oop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
coleenp@548 434 inline void do_oop_nv(narrowOop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
duke@435 435 };

mercurial