hotspot/src/share/vm/gc/shared/preservedMarks.inline.hpp
changeset 37422 8a7443b5edf8
parent 36202 219f8808c3bd
child 39228 32ce84798166
equal deleted inserted replaced
37421:505b09d74f49 37422:8a7443b5edf8
    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