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

Wed, 23 Sep 2009 23:57:44 -0700

author
jrose
date
Wed, 23 Sep 2009 23:57:44 -0700
changeset 1429
753cf9794df9
parent 1428
54b3b351d6f9
child 1907
c18cbe5936b8
permissions
-rw-r--r--

6885169: merge of 4957990 and 6863023 causes conflict on do_nmethods
Summary: After mechanically merging changes, some by-hand adjustments are needed.
Reviewed-by: ysr

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 protected:
coleenp@548 51 DO_OOP_WORK_DEFN
duke@435 52 public:
jrose@1429 53 MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap);
coleenp@548 54 virtual void do_oop(oop* p);
coleenp@548 55 virtual void do_oop(narrowOop* p);
coleenp@548 56 inline void do_oop_nv(oop* p) { MarkRefsIntoClosure::do_oop_work(p); }
coleenp@548 57 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); }
duke@435 58 bool do_header() { return true; }
duke@435 59 Prefetch::style prefetch_style() {
duke@435 60 return Prefetch::do_read;
duke@435 61 }
duke@435 62 };
duke@435 63
duke@435 64 // A variant of the above used in certain kinds of CMS
duke@435 65 // marking verification.
duke@435 66 class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
coleenp@548 67 private:
coleenp@548 68 const MemRegion _span;
coleenp@548 69 CMSBitMap* _verification_bm;
coleenp@548 70 CMSBitMap* _cms_bm;
coleenp@548 71 protected:
coleenp@548 72 DO_OOP_WORK_DEFN
duke@435 73 public:
duke@435 74 MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
jrose@1429 75 CMSBitMap* cms_bm);
coleenp@548 76 virtual void do_oop(oop* p);
coleenp@548 77 virtual void do_oop(narrowOop* p);
coleenp@548 78 inline void do_oop_nv(oop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
coleenp@548 79 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
duke@435 80 bool do_header() { return true; }
duke@435 81 Prefetch::style prefetch_style() {
duke@435 82 return Prefetch::do_read;
duke@435 83 }
duke@435 84 };
duke@435 85
jmasa@1370 86 // KlassRememberingOopClosure is used when marking of the permanent generation
jmasa@1370 87 // is being done. It adds fields to support revisiting of klasses
jmasa@1370 88 // for class unloading. _should_remember_klasses should be set to
jmasa@1370 89 // indicate if klasses should be remembered. Currently that is whenever
jmasa@1370 90 // CMS class unloading is turned on. The _revisit_stack is used
jmasa@1370 91 // to save the klasses for later processing.
jmasa@1370 92 class KlassRememberingOopClosure : public OopClosure {
jmasa@1370 93 protected:
jmasa@1370 94 CMSCollector* _collector;
jmasa@1370 95 CMSMarkStack* _revisit_stack;
jmasa@1370 96 bool const _should_remember_klasses;
jmasa@1370 97 public:
jmasa@1370 98 void check_remember_klasses() const PRODUCT_RETURN;
jmasa@1370 99 virtual const bool should_remember_klasses() const {
jmasa@1370 100 check_remember_klasses();
jmasa@1370 101 return _should_remember_klasses;
jmasa@1370 102 }
jmasa@1370 103 virtual void remember_klass(Klass* k);
jmasa@1370 104
jmasa@1370 105 KlassRememberingOopClosure(CMSCollector* collector,
jmasa@1370 106 ReferenceProcessor* rp,
jmasa@1370 107 CMSMarkStack* revisit_stack);
jmasa@1370 108 };
jmasa@1370 109
jmasa@1370 110 // Similar to KlassRememberingOopClosure for use when multiple
jmasa@1370 111 // GC threads will execute the closure.
jmasa@1370 112
jmasa@1370 113 class Par_KlassRememberingOopClosure : public KlassRememberingOopClosure {
jmasa@1370 114 public:
jmasa@1370 115 Par_KlassRememberingOopClosure(CMSCollector* collector,
jmasa@1370 116 ReferenceProcessor* rp,
jmasa@1370 117 CMSMarkStack* revisit_stack):
jmasa@1370 118 KlassRememberingOopClosure(collector, rp, revisit_stack) {}
jmasa@1370 119 virtual void remember_klass(Klass* k);
jmasa@1370 120 };
jmasa@1370 121
duke@435 122 // The non-parallel version (the parallel version appears further below).
jmasa@1370 123 class PushAndMarkClosure: public KlassRememberingOopClosure {
coleenp@548 124 private:
coleenp@548 125 MemRegion _span;
coleenp@548 126 CMSBitMap* _bit_map;
coleenp@548 127 CMSBitMap* _mod_union_table;
coleenp@548 128 CMSMarkStack* _mark_stack;
coleenp@548 129 bool _concurrent_precleaning;
coleenp@548 130 protected:
coleenp@548 131 DO_OOP_WORK_DEFN
duke@435 132 public:
duke@435 133 PushAndMarkClosure(CMSCollector* collector,
duke@435 134 MemRegion span,
duke@435 135 ReferenceProcessor* rp,
duke@435 136 CMSBitMap* bit_map,
duke@435 137 CMSBitMap* mod_union_table,
coleenp@548 138 CMSMarkStack* mark_stack,
coleenp@548 139 CMSMarkStack* revisit_stack,
coleenp@548 140 bool concurrent_precleaning);
coleenp@548 141 virtual void do_oop(oop* p);
coleenp@548 142 virtual void do_oop(narrowOop* p);
coleenp@548 143 inline void do_oop_nv(oop* p) { PushAndMarkClosure::do_oop_work(p); }
coleenp@548 144 inline void do_oop_nv(narrowOop* p) { PushAndMarkClosure::do_oop_work(p); }
duke@435 145 bool do_header() { return true; }
duke@435 146 Prefetch::style prefetch_style() {
duke@435 147 return Prefetch::do_read;
duke@435 148 }
ysr@1376 149 // In support of class unloading
ysr@1376 150 virtual const bool should_remember_mdo() const {
ysr@1376 151 return false;
ysr@1376 152 // return _should_remember_klasses;
ysr@1376 153 }
ysr@1376 154 virtual void remember_mdo(DataLayout* v);
duke@435 155 };
duke@435 156
duke@435 157 // In the parallel case, the revisit stack, the bit map and the
duke@435 158 // reference processor are currently all shared. Access to
duke@435 159 // these shared mutable structures must use appropriate
duke@435 160 // synchronization (for instance, via CAS). The marking stack
duke@435 161 // used in the non-parallel case above is here replaced with
duke@435 162 // an OopTaskQueue structure to allow efficient work stealing.
jmasa@1370 163 class Par_PushAndMarkClosure: public Par_KlassRememberingOopClosure {
coleenp@548 164 private:
coleenp@548 165 MemRegion _span;
coleenp@548 166 CMSBitMap* _bit_map;
coleenp@548 167 OopTaskQueue* _work_queue;
coleenp@548 168 protected:
coleenp@548 169 DO_OOP_WORK_DEFN
duke@435 170 public:
duke@435 171 Par_PushAndMarkClosure(CMSCollector* collector,
duke@435 172 MemRegion span,
duke@435 173 ReferenceProcessor* rp,
duke@435 174 CMSBitMap* bit_map,
duke@435 175 OopTaskQueue* work_queue,
duke@435 176 CMSMarkStack* revisit_stack);
coleenp@548 177 virtual void do_oop(oop* p);
coleenp@548 178 virtual void do_oop(narrowOop* p);
coleenp@548 179 inline void do_oop_nv(oop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
coleenp@548 180 inline void do_oop_nv(narrowOop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
duke@435 181 bool do_header() { return true; }
duke@435 182 Prefetch::style prefetch_style() {
duke@435 183 return Prefetch::do_read;
duke@435 184 }
ysr@1376 185 // In support of class unloading
ysr@1376 186 virtual const bool should_remember_mdo() const {
ysr@1376 187 return false;
ysr@1376 188 // return _should_remember_klasses;
ysr@1376 189 }
ysr@1376 190 virtual void remember_mdo(DataLayout* v);
duke@435 191 };
duke@435 192
duke@435 193 // The non-parallel version (the parallel version appears further below).
duke@435 194 class MarkRefsIntoAndScanClosure: public OopsInGenClosure {
coleenp@548 195 private:
coleenp@548 196 MemRegion _span;
coleenp@548 197 CMSBitMap* _bit_map;
coleenp@548 198 CMSMarkStack* _mark_stack;
coleenp@548 199 PushAndMarkClosure _pushAndMarkClosure;
coleenp@548 200 CMSCollector* _collector;
coleenp@548 201 Mutex* _freelistLock;
coleenp@548 202 bool _yield;
duke@435 203 // Whether closure is being used for concurrent precleaning
coleenp@548 204 bool _concurrent_precleaning;
coleenp@548 205 protected:
coleenp@548 206 DO_OOP_WORK_DEFN
duke@435 207 public:
duke@435 208 MarkRefsIntoAndScanClosure(MemRegion span,
duke@435 209 ReferenceProcessor* rp,
duke@435 210 CMSBitMap* bit_map,
duke@435 211 CMSBitMap* mod_union_table,
coleenp@548 212 CMSMarkStack* mark_stack,
coleenp@548 213 CMSMarkStack* revisit_stack,
duke@435 214 CMSCollector* collector,
duke@435 215 bool should_yield,
duke@435 216 bool concurrent_precleaning);
coleenp@548 217 virtual void do_oop(oop* p);
coleenp@548 218 virtual void do_oop(narrowOop* p);
coleenp@548 219 inline void do_oop_nv(oop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
coleenp@548 220 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
duke@435 221 bool do_header() { return true; }
duke@435 222 Prefetch::style prefetch_style() {
duke@435 223 return Prefetch::do_read;
duke@435 224 }
duke@435 225 void set_freelistLock(Mutex* m) {
duke@435 226 _freelistLock = m;
duke@435 227 }
jmasa@1370 228 virtual const bool should_remember_klasses() const {
jmasa@1370 229 return _pushAndMarkClosure.should_remember_klasses();
jmasa@1370 230 }
jmasa@1370 231 virtual void remember_klass(Klass* k) {
jmasa@1370 232 _pushAndMarkClosure.remember_klass(k);
jmasa@1370 233 }
duke@435 234
duke@435 235 private:
duke@435 236 inline void do_yield_check();
duke@435 237 void do_yield_work();
duke@435 238 bool take_from_overflow_list();
duke@435 239 };
duke@435 240
duke@435 241 // Tn this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
duke@435 242 // stack and the bitMap are shared, so access needs to be suitably
duke@435 243 // sycnhronized. An OopTaskQueue structure, supporting efficient
duke@435 244 // workstealing, replaces a CMSMarkStack for storing grey objects.
duke@435 245 class Par_MarkRefsIntoAndScanClosure: public OopsInGenClosure {
coleenp@548 246 private:
coleenp@548 247 MemRegion _span;
coleenp@548 248 CMSBitMap* _bit_map;
coleenp@548 249 OopTaskQueue* _work_queue;
coleenp@548 250 const uint _low_water_mark;
coleenp@548 251 Par_PushAndMarkClosure _par_pushAndMarkClosure;
coleenp@548 252 protected:
coleenp@548 253 DO_OOP_WORK_DEFN
duke@435 254 public:
duke@435 255 Par_MarkRefsIntoAndScanClosure(CMSCollector* collector,
duke@435 256 MemRegion span,
duke@435 257 ReferenceProcessor* rp,
duke@435 258 CMSBitMap* bit_map,
duke@435 259 OopTaskQueue* work_queue,
duke@435 260 CMSMarkStack* revisit_stack);
coleenp@548 261 virtual void do_oop(oop* p);
coleenp@548 262 virtual void do_oop(narrowOop* p);
coleenp@548 263 inline void do_oop_nv(oop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
coleenp@548 264 inline void do_oop_nv(narrowOop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
duke@435 265 bool do_header() { return true; }
jmasa@1370 266 // When ScanMarkedObjectsAgainClosure is used,
jmasa@1370 267 // it passes [Par_]MarkRefsIntoAndScanClosure to oop_oop_iterate(),
jmasa@1370 268 // and this delegation is used.
jmasa@1370 269 virtual const bool should_remember_klasses() const {
jmasa@1370 270 return _par_pushAndMarkClosure.should_remember_klasses();
jmasa@1370 271 }
jmasa@1370 272 // See comment on should_remember_klasses() above.
jmasa@1370 273 virtual void remember_klass(Klass* k) {
jmasa@1370 274 _par_pushAndMarkClosure.remember_klass(k);
jmasa@1370 275 }
duke@435 276 Prefetch::style prefetch_style() {
duke@435 277 return Prefetch::do_read;
duke@435 278 }
duke@435 279 void trim_queue(uint size);
duke@435 280 };
duke@435 281
duke@435 282 // This closure is used during the concurrent marking phase
duke@435 283 // following the first checkpoint. Its use is buried in
duke@435 284 // the closure MarkFromRootsClosure.
jmasa@1370 285 class PushOrMarkClosure: public KlassRememberingOopClosure {
coleenp@548 286 private:
coleenp@548 287 MemRegion _span;
coleenp@548 288 CMSBitMap* _bitMap;
coleenp@548 289 CMSMarkStack* _markStack;
coleenp@548 290 HeapWord* const _finger;
coleenp@548 291 MarkFromRootsClosure* const
coleenp@548 292 _parent;
coleenp@548 293 protected:
coleenp@548 294 DO_OOP_WORK_DEFN
duke@435 295 public:
duke@435 296 PushOrMarkClosure(CMSCollector* cms_collector,
duke@435 297 MemRegion span,
duke@435 298 CMSBitMap* bitMap,
coleenp@548 299 CMSMarkStack* markStack,
coleenp@548 300 CMSMarkStack* revisitStack,
coleenp@548 301 HeapWord* finger,
duke@435 302 MarkFromRootsClosure* parent);
coleenp@548 303 virtual void do_oop(oop* p);
coleenp@548 304 virtual void do_oop(narrowOop* p);
coleenp@548 305 inline void do_oop_nv(oop* p) { PushOrMarkClosure::do_oop_work(p); }
coleenp@548 306 inline void do_oop_nv(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); }
ysr@1376 307 // In support of class unloading
ysr@1376 308 virtual const bool should_remember_mdo() const {
ysr@1376 309 return false;
ysr@1376 310 // return _should_remember_klasses;
ysr@1376 311 }
ysr@1376 312 virtual void remember_mdo(DataLayout* v);
ysr@1376 313
duke@435 314 // Deal with a stack overflow condition
duke@435 315 void handle_stack_overflow(HeapWord* lost);
duke@435 316 private:
duke@435 317 inline void do_yield_check();
duke@435 318 };
duke@435 319
duke@435 320 // A parallel (MT) version of the above.
duke@435 321 // This closure is used during the concurrent marking phase
duke@435 322 // following the first checkpoint. Its use is buried in
duke@435 323 // the closure Par_MarkFromRootsClosure.
jmasa@1370 324 class Par_PushOrMarkClosure: public Par_KlassRememberingOopClosure {
coleenp@548 325 private:
duke@435 326 MemRegion _whole_span;
duke@435 327 MemRegion _span; // local chunk
duke@435 328 CMSBitMap* _bit_map;
duke@435 329 OopTaskQueue* _work_queue;
duke@435 330 CMSMarkStack* _overflow_stack;
duke@435 331 HeapWord* const _finger;
duke@435 332 HeapWord** const _global_finger_addr;
coleenp@548 333 Par_MarkFromRootsClosure* const
coleenp@548 334 _parent;
coleenp@548 335 protected:
coleenp@548 336 DO_OOP_WORK_DEFN
duke@435 337 public:
duke@435 338 Par_PushOrMarkClosure(CMSCollector* cms_collector,
coleenp@548 339 MemRegion span,
coleenp@548 340 CMSBitMap* bit_map,
coleenp@548 341 OopTaskQueue* work_queue,
coleenp@548 342 CMSMarkStack* mark_stack,
coleenp@548 343 CMSMarkStack* revisit_stack,
coleenp@548 344 HeapWord* finger,
coleenp@548 345 HeapWord** global_finger_addr,
coleenp@548 346 Par_MarkFromRootsClosure* parent);
coleenp@548 347 virtual void do_oop(oop* p);
coleenp@548 348 virtual void do_oop(narrowOop* p);
coleenp@548 349 inline void do_oop_nv(oop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
coleenp@548 350 inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
ysr@1376 351 // In support of class unloading
ysr@1376 352 virtual const bool should_remember_mdo() const {
ysr@1376 353 return false;
ysr@1376 354 // return _should_remember_klasses;
ysr@1376 355 }
ysr@1376 356 virtual void remember_mdo(DataLayout* v);
ysr@1376 357
duke@435 358 // Deal with a stack overflow condition
duke@435 359 void handle_stack_overflow(HeapWord* lost);
duke@435 360 private:
duke@435 361 inline void do_yield_check();
duke@435 362 };
duke@435 363
duke@435 364 // For objects in CMS generation, this closure marks
duke@435 365 // given objects (transitively) as being reachable/live.
duke@435 366 // This is currently used during the (weak) reference object
ysr@887 367 // processing phase of the CMS final checkpoint step, as
ysr@887 368 // well as during the concurrent precleaning of the discovered
ysr@887 369 // reference lists.
jmasa@1370 370 class CMSKeepAliveClosure: public KlassRememberingOopClosure {
coleenp@548 371 private:
ysr@578 372 const MemRegion _span;
duke@435 373 CMSMarkStack* _mark_stack;
duke@435 374 CMSBitMap* _bit_map;
ysr@887 375 bool _concurrent_precleaning;
coleenp@548 376 protected:
coleenp@548 377 DO_OOP_WORK_DEFN
duke@435 378 public:
duke@435 379 CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
ysr@887 380 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
jmasa@1370 381 CMSMarkStack* revisit_stack, bool cpc);
ysr@887 382 bool concurrent_precleaning() const { return _concurrent_precleaning; }
coleenp@548 383 virtual void do_oop(oop* p);
coleenp@548 384 virtual void do_oop(narrowOop* p);
coleenp@548 385 inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); }
coleenp@548 386 inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
duke@435 387 };
duke@435 388
jmasa@1370 389 class CMSInnerParMarkAndPushClosure: public Par_KlassRememberingOopClosure {
coleenp@548 390 private:
duke@435 391 MemRegion _span;
duke@435 392 OopTaskQueue* _work_queue;
duke@435 393 CMSBitMap* _bit_map;
coleenp@548 394 protected:
coleenp@548 395 DO_OOP_WORK_DEFN
duke@435 396 public:
duke@435 397 CMSInnerParMarkAndPushClosure(CMSCollector* collector,
duke@435 398 MemRegion span, CMSBitMap* bit_map,
jmasa@1370 399 CMSMarkStack* revisit_stack,
jmasa@1370 400 OopTaskQueue* work_queue);
coleenp@548 401 virtual void do_oop(oop* p);
coleenp@548 402 virtual void do_oop(narrowOop* p);
coleenp@548 403 inline void do_oop_nv(oop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
coleenp@548 404 inline void do_oop_nv(narrowOop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
duke@435 405 };
duke@435 406
duke@435 407 // A parallel (MT) version of the above, used when
duke@435 408 // reference processing is parallel; the only difference
duke@435 409 // is in the do_oop method.
jmasa@1370 410 class CMSParKeepAliveClosure: public Par_KlassRememberingOopClosure {
coleenp@548 411 private:
duke@435 412 MemRegion _span;
duke@435 413 OopTaskQueue* _work_queue;
duke@435 414 CMSBitMap* _bit_map;
coleenp@548 415 CMSInnerParMarkAndPushClosure
coleenp@548 416 _mark_and_push;
duke@435 417 const uint _low_water_mark;
duke@435 418 void trim_queue(uint max);
coleenp@548 419 protected:
coleenp@548 420 DO_OOP_WORK_DEFN
duke@435 421 public:
duke@435 422 CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
jmasa@1370 423 CMSBitMap* bit_map, CMSMarkStack* revisit_stack,
jmasa@1370 424 OopTaskQueue* work_queue);
coleenp@548 425 virtual void do_oop(oop* p);
coleenp@548 426 virtual void do_oop(narrowOop* p);
coleenp@548 427 inline void do_oop_nv(oop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
coleenp@548 428 inline void do_oop_nv(narrowOop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
duke@435 429 };

mercurial