27
28 #include "memory/allocation.hpp"
29 #include "memory/padded.hpp"
30 #include "oops/oop.hpp"
31 #include "utilities/stack.hpp"
32
33 class PreservedMarksSet;
34 class WorkGang;
35
36 class PreservedMarks {
37 private:
38 class OopAndMarkOop {
39 private:
40 oop _o;
41 markOop _m;
42
43 public:
44 OopAndMarkOop(oop obj, markOop m) : _o(obj), _m(m) { }
45
46 oop get_oop() { return _o; }
47 void set_mark() const { _o->set_mark(_m); }
48 void set_oop(oop obj) { _o = obj; }
49 };
50 typedef Stack<OopAndMarkOop, mtGC> OopAndMarkOopStack;
51
52 OopAndMarkOopStack _stack;
53
54 inline bool should_preserve_mark(oop obj, markOop m) const;
55
56 public:
57 size_t size() const { return _stack.size(); }
58 inline void push(oop obj, markOop m);
59 inline void push_if_necessary(oop obj, markOop m);
60 // Iterate over the stack, restore all preserved marks, and
61 // reclaim the memory taken up by the stack segments.
62 void restore();
63 // Iterate over the stack, adjust all preserved marks according
64 // to their forwarding location stored in the mark.
65 void adjust_during_full_gc();
66
67 void restore_and_increment(volatile size_t* const _total_size_addr);
|
27
28 #include "memory/allocation.hpp"
29 #include "memory/padded.hpp"
30 #include "oops/oop.hpp"
31 #include "utilities/stack.hpp"
32
33 class PreservedMarksSet;
34 class WorkGang;
35
36 class PreservedMarks {
37 private:
38 class OopAndMarkOop {
39 private:
40 oop _o;
41 markOop _m;
42
43 public:
44 OopAndMarkOop(oop obj, markOop m) : _o(obj), _m(m) { }
45
46 oop get_oop() { return _o; }
47 inline void set_mark() const;
48 void set_oop(oop obj) { _o = obj; }
49 };
50 typedef Stack<OopAndMarkOop, mtGC> OopAndMarkOopStack;
51
52 OopAndMarkOopStack _stack;
53
54 inline bool should_preserve_mark(oop obj, markOop m) const;
55
56 public:
57 size_t size() const { return _stack.size(); }
58 inline void push(oop obj, markOop m);
59 inline void push_if_necessary(oop obj, markOop m);
60 // Iterate over the stack, restore all preserved marks, and
61 // reclaim the memory taken up by the stack segments.
62 void restore();
63 // Iterate over the stack, adjust all preserved marks according
64 // to their forwarding location stored in the mark.
65 void adjust_during_full_gc();
66
67 void restore_and_increment(volatile size_t* const _total_size_addr);
|