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

Tue, 23 Nov 2010 13:22:55 -0800

author
stefank
date
Tue, 23 Nov 2010 13:22:55 -0800
changeset 2314
f95d63e2154a
parent 1907
c18cbe5936b8
child 4037
da91efe96a93
permissions
-rw-r--r--

6989984: Use standard include model for Hospot
Summary: Replaced MakeDeps and the includeDB files with more standardized solutions.
Reviewed-by: coleenp, kvn, kamg

duke@435 1 /*
stefank@2314 2 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. 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 *
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.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CMSOOPCLOSURES_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CMSOOPCLOSURES_HPP
stefank@2314 27
stefank@2314 28 #include "memory/genOopClosures.hpp"
stefank@2314 29
duke@435 30 /////////////////////////////////////////////////////////////////
duke@435 31 // Closures used by ConcurrentMarkSweepGeneration's collector
duke@435 32 /////////////////////////////////////////////////////////////////
duke@435 33 class ConcurrentMarkSweepGeneration;
duke@435 34 class CMSBitMap;
duke@435 35 class CMSMarkStack;
duke@435 36 class CMSCollector;
duke@435 37 class MarkFromRootsClosure;
duke@435 38 class Par_MarkFromRootsClosure;
duke@435 39
coleenp@548 40 // Decode the oop and call do_oop on it.
coleenp@548 41 #define DO_OOP_WORK_DEFN \
coleenp@548 42 void do_oop(oop obj); \
coleenp@548 43 template <class T> inline void do_oop_work(T* p) { \
coleenp@548 44 T heap_oop = oopDesc::load_heap_oop(p); \
coleenp@548 45 if (!oopDesc::is_null(heap_oop)) { \
coleenp@548 46 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); \
coleenp@548 47 do_oop(obj); \
coleenp@548 48 } \
coleenp@548 49 }
coleenp@548 50
duke@435 51 class MarkRefsIntoClosure: public OopsInGenClosure {
coleenp@548 52 private:
coleenp@548 53 const MemRegion _span;
coleenp@548 54 CMSBitMap* _bitMap;
coleenp@548 55 protected:
coleenp@548 56 DO_OOP_WORK_DEFN
duke@435 57 public:
jrose@1429 58 MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap);
coleenp@548 59 virtual void do_oop(oop* p);
coleenp@548 60 virtual void do_oop(narrowOop* p);
coleenp@548 61 inline void do_oop_nv(oop* p) { MarkRefsIntoClosure::do_oop_work(p); }
coleenp@548 62 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); }
duke@435 63 bool do_header() { return true; }
duke@435 64 Prefetch::style prefetch_style() {
duke@435 65 return Prefetch::do_read;
duke@435 66 }
duke@435 67 };
duke@435 68
duke@435 69 // A variant of the above used in certain kinds of CMS
duke@435 70 // marking verification.
duke@435 71 class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
coleenp@548 72 private:
coleenp@548 73 const MemRegion _span;
coleenp@548 74 CMSBitMap* _verification_bm;
coleenp@548 75 CMSBitMap* _cms_bm;
coleenp@548 76 protected:
coleenp@548 77 DO_OOP_WORK_DEFN
duke@435 78 public:
duke@435 79 MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
jrose@1429 80 CMSBitMap* cms_bm);
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; }
jmasa@1370 271 // When ScanMarkedObjectsAgainClosure is used,
jmasa@1370 272 // it passes [Par_]MarkRefsIntoAndScanClosure to oop_oop_iterate(),
jmasa@1370 273 // and this delegation is used.
jmasa@1370 274 virtual const bool should_remember_klasses() const {
jmasa@1370 275 return _par_pushAndMarkClosure.should_remember_klasses();
jmasa@1370 276 }
jmasa@1370 277 // See comment on should_remember_klasses() above.
jmasa@1370 278 virtual void remember_klass(Klass* k) {
jmasa@1370 279 _par_pushAndMarkClosure.remember_klass(k);
jmasa@1370 280 }
duke@435 281 Prefetch::style prefetch_style() {
duke@435 282 return Prefetch::do_read;
duke@435 283 }
duke@435 284 void trim_queue(uint size);
duke@435 285 };
duke@435 286
duke@435 287 // This closure is used during the concurrent marking phase
duke@435 288 // following the first checkpoint. Its use is buried in
duke@435 289 // the closure MarkFromRootsClosure.
jmasa@1370 290 class PushOrMarkClosure: public KlassRememberingOopClosure {
coleenp@548 291 private:
coleenp@548 292 MemRegion _span;
coleenp@548 293 CMSBitMap* _bitMap;
coleenp@548 294 CMSMarkStack* _markStack;
coleenp@548 295 HeapWord* const _finger;
coleenp@548 296 MarkFromRootsClosure* const
coleenp@548 297 _parent;
coleenp@548 298 protected:
coleenp@548 299 DO_OOP_WORK_DEFN
duke@435 300 public:
duke@435 301 PushOrMarkClosure(CMSCollector* cms_collector,
duke@435 302 MemRegion span,
duke@435 303 CMSBitMap* bitMap,
coleenp@548 304 CMSMarkStack* markStack,
coleenp@548 305 CMSMarkStack* revisitStack,
coleenp@548 306 HeapWord* finger,
duke@435 307 MarkFromRootsClosure* parent);
coleenp@548 308 virtual void do_oop(oop* p);
coleenp@548 309 virtual void do_oop(narrowOop* p);
coleenp@548 310 inline void do_oop_nv(oop* p) { PushOrMarkClosure::do_oop_work(p); }
coleenp@548 311 inline void do_oop_nv(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); }
ysr@1376 312 // In support of class unloading
ysr@1376 313 virtual const bool should_remember_mdo() const {
ysr@1376 314 return false;
ysr@1376 315 // return _should_remember_klasses;
ysr@1376 316 }
ysr@1376 317 virtual void remember_mdo(DataLayout* v);
ysr@1376 318
duke@435 319 // Deal with a stack overflow condition
duke@435 320 void handle_stack_overflow(HeapWord* lost);
duke@435 321 private:
duke@435 322 inline void do_yield_check();
duke@435 323 };
duke@435 324
duke@435 325 // A parallel (MT) version of the above.
duke@435 326 // This closure is used during the concurrent marking phase
duke@435 327 // following the first checkpoint. Its use is buried in
duke@435 328 // the closure Par_MarkFromRootsClosure.
jmasa@1370 329 class Par_PushOrMarkClosure: public Par_KlassRememberingOopClosure {
coleenp@548 330 private:
duke@435 331 MemRegion _whole_span;
duke@435 332 MemRegion _span; // local chunk
duke@435 333 CMSBitMap* _bit_map;
duke@435 334 OopTaskQueue* _work_queue;
duke@435 335 CMSMarkStack* _overflow_stack;
duke@435 336 HeapWord* const _finger;
duke@435 337 HeapWord** const _global_finger_addr;
coleenp@548 338 Par_MarkFromRootsClosure* const
coleenp@548 339 _parent;
coleenp@548 340 protected:
coleenp@548 341 DO_OOP_WORK_DEFN
duke@435 342 public:
duke@435 343 Par_PushOrMarkClosure(CMSCollector* cms_collector,
coleenp@548 344 MemRegion span,
coleenp@548 345 CMSBitMap* bit_map,
coleenp@548 346 OopTaskQueue* work_queue,
coleenp@548 347 CMSMarkStack* mark_stack,
coleenp@548 348 CMSMarkStack* revisit_stack,
coleenp@548 349 HeapWord* finger,
coleenp@548 350 HeapWord** global_finger_addr,
coleenp@548 351 Par_MarkFromRootsClosure* parent);
coleenp@548 352 virtual void do_oop(oop* p);
coleenp@548 353 virtual void do_oop(narrowOop* p);
coleenp@548 354 inline void do_oop_nv(oop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
coleenp@548 355 inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
ysr@1376 356 // In support of class unloading
ysr@1376 357 virtual const bool should_remember_mdo() const {
ysr@1376 358 return false;
ysr@1376 359 // return _should_remember_klasses;
ysr@1376 360 }
ysr@1376 361 virtual void remember_mdo(DataLayout* v);
ysr@1376 362
duke@435 363 // Deal with a stack overflow condition
duke@435 364 void handle_stack_overflow(HeapWord* lost);
duke@435 365 private:
duke@435 366 inline void do_yield_check();
duke@435 367 };
duke@435 368
duke@435 369 // For objects in CMS generation, this closure marks
duke@435 370 // given objects (transitively) as being reachable/live.
duke@435 371 // This is currently used during the (weak) reference object
ysr@887 372 // processing phase of the CMS final checkpoint step, as
ysr@887 373 // well as during the concurrent precleaning of the discovered
ysr@887 374 // reference lists.
jmasa@1370 375 class CMSKeepAliveClosure: public KlassRememberingOopClosure {
coleenp@548 376 private:
ysr@578 377 const MemRegion _span;
duke@435 378 CMSMarkStack* _mark_stack;
duke@435 379 CMSBitMap* _bit_map;
ysr@887 380 bool _concurrent_precleaning;
coleenp@548 381 protected:
coleenp@548 382 DO_OOP_WORK_DEFN
duke@435 383 public:
duke@435 384 CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
ysr@887 385 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
jmasa@1370 386 CMSMarkStack* revisit_stack, bool cpc);
ysr@887 387 bool concurrent_precleaning() const { return _concurrent_precleaning; }
coleenp@548 388 virtual void do_oop(oop* p);
coleenp@548 389 virtual void do_oop(narrowOop* p);
coleenp@548 390 inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); }
coleenp@548 391 inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
duke@435 392 };
duke@435 393
jmasa@1370 394 class CMSInnerParMarkAndPushClosure: public Par_KlassRememberingOopClosure {
coleenp@548 395 private:
duke@435 396 MemRegion _span;
duke@435 397 OopTaskQueue* _work_queue;
duke@435 398 CMSBitMap* _bit_map;
coleenp@548 399 protected:
coleenp@548 400 DO_OOP_WORK_DEFN
duke@435 401 public:
duke@435 402 CMSInnerParMarkAndPushClosure(CMSCollector* collector,
duke@435 403 MemRegion span, CMSBitMap* bit_map,
jmasa@1370 404 CMSMarkStack* revisit_stack,
jmasa@1370 405 OopTaskQueue* work_queue);
coleenp@548 406 virtual void do_oop(oop* p);
coleenp@548 407 virtual void do_oop(narrowOop* p);
coleenp@548 408 inline void do_oop_nv(oop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
coleenp@548 409 inline void do_oop_nv(narrowOop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
duke@435 410 };
duke@435 411
duke@435 412 // A parallel (MT) version of the above, used when
duke@435 413 // reference processing is parallel; the only difference
duke@435 414 // is in the do_oop method.
jmasa@1370 415 class CMSParKeepAliveClosure: public Par_KlassRememberingOopClosure {
coleenp@548 416 private:
duke@435 417 MemRegion _span;
duke@435 418 OopTaskQueue* _work_queue;
duke@435 419 CMSBitMap* _bit_map;
coleenp@548 420 CMSInnerParMarkAndPushClosure
coleenp@548 421 _mark_and_push;
duke@435 422 const uint _low_water_mark;
duke@435 423 void trim_queue(uint max);
coleenp@548 424 protected:
coleenp@548 425 DO_OOP_WORK_DEFN
duke@435 426 public:
duke@435 427 CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
jmasa@1370 428 CMSBitMap* bit_map, CMSMarkStack* revisit_stack,
jmasa@1370 429 OopTaskQueue* work_queue);
coleenp@548 430 virtual void do_oop(oop* p);
coleenp@548 431 virtual void do_oop(narrowOop* p);
coleenp@548 432 inline void do_oop_nv(oop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
coleenp@548 433 inline void do_oop_nv(narrowOop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
duke@435 434 };
stefank@2314 435
stefank@2314 436 #endif // SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CMSOOPCLOSURES_HPP

mercurial