< prev index next >
src/hotspot/share/gc/g1/g1ParScanThreadState.inline.hpp
Print this page
rev 49826 : imported patch 6672778-partial-queue-trimming
rev 49827 : imported patch 6672778-refactoring
rev 49828 : imported patch 6672778-stefanj-review
rev 49829 : imported patch 6672778-inconsistent-time-fixes
*** 27,36 ****
--- 27,37 ----
#include "gc/g1/g1ParScanThreadState.hpp"
#include "gc/g1/g1RemSet.hpp"
#include "oops/access.inline.hpp"
#include "oops/oop.inline.hpp"
+ #include "utilities/ticks.inline.hpp"
template <class T> void G1ParScanThreadState::do_oop_evac(T* p) {
// Reference should not be NULL here as such are never pushed to the task queue.
oop obj = RawAccess<OOP_NOT_NULL>::oop_load(p);
*** 149,154 ****
--- 150,197 ----
// we drain the queues as necessary.
trim_queue();
}
}
+ inline bool G1ParScanThreadState::needs_partial_trimming() const {
+ return !_refs->overflow_empty() || _refs->size() > _stack_trim_upper_threshold;
+ }
+
+ inline bool G1ParScanThreadState::is_partially_trimmed() const {
+ return _refs->overflow_empty() && _refs->size() <= _stack_trim_lower_threshold;
+ }
+
+ inline void G1ParScanThreadState::trim_queue_to_threshold(uint threshold) {
+ StarTask ref;
+ // Drain the overflow stack first, so other threads can potentially steal.
+ while (_refs->pop_overflow(ref)) {
+ if (!_refs->try_push_to_taskqueue(ref)) {
+ dispatch_reference(ref);
+ }
+ }
+
+ while (_refs->pop_local(ref, threshold)) {
+ dispatch_reference(ref);
+ }
+ }
+
+ inline void G1ParScanThreadState::trim_queue_partially() {
+ if (!needs_partial_trimming()) {
+ return;
+ }
+
+ const Ticks start = Ticks::now();
+ do {
+ trim_queue_to_threshold(_stack_trim_lower_threshold);
+ } while (!is_partially_trimmed());
+ _trim_ticks += Ticks::now() - start;
+ }
+
+ inline Tickspan G1ParScanThreadState::trim_ticks() {
+ return _trim_ticks;
+ }
+
+ inline void G1ParScanThreadState::reset_trim_ticks() {
+ _trim_ticks = Tickspan();
+ }
+
#endif // SHARE_VM_GC_G1_G1PARSCANTHREADSTATE_INLINE_HPP
< prev index next >