20 * or visit www.oracle.com if you need additional information or have any |
20 * or visit www.oracle.com if you need additional information or have any |
21 * questions. |
21 * questions. |
22 * |
22 * |
23 */ |
23 */ |
24 |
24 |
25 #include "gc/shared/preservedMarks.hpp" |
|
26 #include "oops/markOop.inline.hpp" |
|
27 #include "utilities/stack.inline.hpp" |
|
28 |
|
29 #ifndef SHARE_VM_GC_SHARED_PRESERVEDMARKS_INLINE_HPP |
25 #ifndef SHARE_VM_GC_SHARED_PRESERVEDMARKS_INLINE_HPP |
30 #define SHARE_VM_GC_SHARED_PRESERVEDMARKS_INLINE_HPP |
26 #define SHARE_VM_GC_SHARED_PRESERVEDMARKS_INLINE_HPP |
|
27 |
|
28 #include "gc/shared/preservedMarks.hpp" |
|
29 #include "oops/oop.inline.hpp" |
|
30 #include "utilities/stack.inline.hpp" |
31 |
31 |
32 inline bool PreservedMarks::should_preserve_mark(oop obj, markOop m) const { |
32 inline bool PreservedMarks::should_preserve_mark(oop obj, markOop m) const { |
33 return m->must_be_preserved_for_promotion_failure(obj); |
33 return m->must_be_preserved_for_promotion_failure(obj); |
34 } |
34 } |
35 |
35 |
43 if (should_preserve_mark(obj, m)) { |
43 if (should_preserve_mark(obj, m)) { |
44 push(obj, m); |
44 push(obj, m); |
45 } |
45 } |
46 } |
46 } |
47 |
47 |
|
48 inline void PreservedMarks::init_forwarded_mark(oop obj) { |
|
49 obj->init_mark(); |
|
50 } |
|
51 |
|
52 template <class E> |
|
53 inline void PreservedMarksSet::restore(E* executor) { |
|
54 volatile size_t total_size = 0; |
|
55 |
|
56 #ifdef ASSERT |
|
57 // This is to make sure the total_size we'll calculate below is correct. |
|
58 size_t total_size_before = 0; |
|
59 for (uint i = 0; i < _num; i += 1) { |
|
60 total_size_before += get(i)->size(); |
|
61 } |
|
62 #endif // def ASSERT |
|
63 |
|
64 if (executor == NULL) { |
|
65 for (uint i = 0; i < _num; i += 1) { |
|
66 total_size += get(i)->size(); |
|
67 get(i)->restore(); |
|
68 } |
|
69 } else { |
|
70 // Right now, if the executor is not NULL we do the work in |
|
71 // parallel. In the future we might want to do the restoration |
|
72 // serially, if there's only a small number of marks per stack. |
|
73 restore_internal(executor, &total_size); |
|
74 } |
|
75 assert_empty(); |
|
76 |
|
77 assert(total_size == total_size_before, |
|
78 "total_size = " SIZE_FORMAT " before = " SIZE_FORMAT, |
|
79 total_size, total_size_before); |
|
80 |
|
81 log_trace(gc)("Restored " SIZE_FORMAT " marks", total_size); |
|
82 } |
|
83 |
|
84 inline PreservedMarks::PreservedMarks() |
|
85 : _stack(OopAndMarkOopStack::default_segment_size(), |
|
86 // This stack should be used very infrequently so there's |
|
87 // no point in caching stack segments (there will be a |
|
88 // waste of space most of the time). So we set the max |
|
89 // cache size to 0. |
|
90 0 /* max_cache_size */) { } |
|
91 |
48 #endif // SHARE_VM_GC_SHARED_PRESERVEDMARKS_INLINE_HPP |
92 #endif // SHARE_VM_GC_SHARED_PRESERVEDMARKS_INLINE_HPP |