33 class PreservedMarksSet; |
33 class PreservedMarksSet; |
34 class WorkGang; |
34 class WorkGang; |
35 |
35 |
36 class PreservedMarks { |
36 class PreservedMarks { |
37 private: |
37 private: |
38 class OopAndMarkOop { |
38 class OopAndMarkWord { |
39 private: |
39 private: |
40 oop _o; |
40 oop _o; |
41 markOop _m; |
41 markWord _m; |
42 |
42 |
43 public: |
43 public: |
44 OopAndMarkOop(oop obj, markOop m) : _o(obj), _m(m) { } |
44 OopAndMarkWord(oop obj, markWord m) : _o(obj), _m(m) { } |
45 |
45 |
46 oop get_oop() { return _o; } |
46 oop get_oop() { return _o; } |
47 inline void set_mark() const; |
47 inline void set_mark() const; |
48 void set_oop(oop obj) { _o = obj; } |
48 void set_oop(oop obj) { _o = obj; } |
49 }; |
49 }; |
50 typedef Stack<OopAndMarkOop, mtGC> OopAndMarkOopStack; |
50 typedef Stack<OopAndMarkWord, mtGC> OopAndMarkWordStack; |
51 |
51 |
52 OopAndMarkOopStack _stack; |
52 OopAndMarkWordStack _stack; |
53 |
53 |
54 inline bool should_preserve_mark(oop obj, markOop m) const; |
54 inline bool should_preserve_mark(oop obj, markWord m) const; |
55 |
55 |
56 public: |
56 public: |
57 size_t size() const { return _stack.size(); } |
57 size_t size() const { return _stack.size(); } |
58 inline void push(oop obj, markOop m); |
58 inline void push(oop obj, markWord m); |
59 inline void push_if_necessary(oop obj, markOop m); |
59 inline void push_if_necessary(oop obj, markWord m); |
60 // Iterate over the stack, restore all preserved marks, and |
60 // Iterate over the stack, restore all preserved marks, and |
61 // reclaim the memory taken up by the stack segments. |
61 // reclaim the memory taken up by the stack segments. |
62 void restore(); |
62 void restore(); |
63 // Iterate over the stack, adjust all preserved marks according |
63 // Iterate over the stack, adjust all preserved marks according |
64 // to their forwarding location stored in the mark. |
64 // to their forwarding location stored in the mark. |