1450
1451 // free the stacks
1452 delete _saved_oop_stack;
1453 delete _saved_mark_stack;
1454 }
1455
1456 // mark an object
1457 inline void ObjectMarker::mark(oop o) {
1458 assert(Universe::heap()->is_in(o), "sanity check");
1459 assert(!o->mark().is_marked(), "should only mark an object once");
1460
1461 // object's mark word
1462 markWord mark = o->mark();
1463
1464 if (o->mark_must_be_preserved(mark)) {
1465 _saved_mark_stack->push(mark);
1466 _saved_oop_stack->push(o);
1467 }
1468
1469 // mark the object
1470 o->set_mark(markWord::prototype().set_marked());
1471 }
1472
1473 // return true if object is marked
1474 inline bool ObjectMarker::visited(oop o) {
1475 return o->mark().is_marked();
1476 }
1477
1478 // Stack allocated class to help ensure that ObjectMarker is used
1479 // correctly. Constructor initializes ObjectMarker, destructor calls
1480 // ObjectMarker's done() function to restore object headers.
1481 class ObjectMarkerController : public StackObj {
1482 public:
1483 ObjectMarkerController() {
1484 ObjectMarker::init();
1485 }
1486 ~ObjectMarkerController() {
1487 ObjectMarker::done();
1488 }
1489 };
1490
|
1450
1451 // free the stacks
1452 delete _saved_oop_stack;
1453 delete _saved_mark_stack;
1454 }
1455
1456 // mark an object
1457 inline void ObjectMarker::mark(oop o) {
1458 assert(Universe::heap()->is_in(o), "sanity check");
1459 assert(!o->mark().is_marked(), "should only mark an object once");
1460
1461 // object's mark word
1462 markWord mark = o->mark();
1463
1464 if (o->mark_must_be_preserved(mark)) {
1465 _saved_mark_stack->push(mark);
1466 _saved_oop_stack->push(o);
1467 }
1468
1469 // mark the object
1470 if (mark.has_displaced_mark_helper()) {
1471 mark = mark.displaced_mark_helper();
1472 }
1473 o->set_mark(mark.set_marked());
1474 }
1475
1476 // return true if object is marked
1477 inline bool ObjectMarker::visited(oop o) {
1478 return o->mark().is_marked();
1479 }
1480
1481 // Stack allocated class to help ensure that ObjectMarker is used
1482 // correctly. Constructor initializes ObjectMarker, destructor calls
1483 // ObjectMarker's done() function to restore object headers.
1484 class ObjectMarkerController : public StackObj {
1485 public:
1486 ObjectMarkerController() {
1487 ObjectMarker::init();
1488 }
1489 ~ObjectMarkerController() {
1490 ObjectMarker::done();
1491 }
1492 };
1493
|