Mercurial > hg > truffle
changeset 7633:7df93f7c14a5
8006242: G1: WorkerDataArray<T>::verify() too strict for double calculations
Summary: Also reviewed by vitalyd@gmail.com.
Reviewed-by: johnc, mgerdin
author | brutisso |
---|---|
date | Wed, 16 Jan 2013 12:46:27 +0100 |
parents | 46e60405583b |
children | bf8c2b2c8cfa |
files | src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp |
diffstat | 2 files changed, 22 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp Fri Jan 18 05:33:32 2013 -0800 +++ b/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp Wed Jan 16 12:46:27 2013 +0100 @@ -131,17 +131,23 @@ #ifndef PRODUCT +template <> const int WorkerDataArray<int>::_uninitialized = -1; +template <> const double WorkerDataArray<double>::_uninitialized = -1.0; +template <> const size_t WorkerDataArray<size_t>::_uninitialized = (size_t)-1; + template <class T> void WorkerDataArray<T>::reset() { for (uint i = 0; i < _length; i++) { - _data[i] = (T)-1; + _data[i] = (T)_uninitialized; } } template <class T> void WorkerDataArray<T>::verify() { for (uint i = 0; i < _length; i++) { - assert(_data[i] >= (T)0, err_msg("Invalid data for worker %d", i)); + assert(_data[i] != _uninitialized, + err_msg("Invalid data for worker " UINT32_FORMAT ", data: %lf, uninitialized: %lf", + i, (double)_data[i], (double)_uninitialized)); } } @@ -201,20 +207,20 @@ _last_termination_attempts.verify(); _last_gc_worker_end_times_ms.verify(); - for (uint i = 0; i < _active_gc_threads; i++) { - double worker_time = _last_gc_worker_end_times_ms.get(i) - _last_gc_worker_start_times_ms.get(i); - _last_gc_worker_times_ms.set(i, worker_time); + for (uint i = 0; i < _active_gc_threads; i++) { + double worker_time = _last_gc_worker_end_times_ms.get(i) - _last_gc_worker_start_times_ms.get(i); + _last_gc_worker_times_ms.set(i, worker_time); - double worker_known_time = _last_ext_root_scan_times_ms.get(i) + - _last_satb_filtering_times_ms.get(i) + - _last_update_rs_times_ms.get(i) + - _last_scan_rs_times_ms.get(i) + - _last_obj_copy_times_ms.get(i) + - _last_termination_times_ms.get(i); + double worker_known_time = _last_ext_root_scan_times_ms.get(i) + + _last_satb_filtering_times_ms.get(i) + + _last_update_rs_times_ms.get(i) + + _last_scan_rs_times_ms.get(i) + + _last_obj_copy_times_ms.get(i) + + _last_termination_times_ms.get(i); - double worker_other_time = worker_time - worker_known_time; - _last_gc_worker_other_times_ms.set(i, worker_other_time); - } + double worker_other_time = worker_time - worker_known_time; + _last_gc_worker_other_times_ms.set(i, worker_other_time); + } _last_gc_worker_times_ms.verify(); _last_gc_worker_other_times_ms.verify();
--- a/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp Fri Jan 18 05:33:32 2013 -0800 +++ b/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp Wed Jan 16 12:46:27 2013 +0100 @@ -35,6 +35,8 @@ const char* _print_format; bool _print_sum; + NOT_PRODUCT(static const T _uninitialized;) + // We are caching the sum and average to only have to calculate them once. // This is not done in an MT-safe way. It is intetened to allow single // threaded code to call sum() and average() multiple times in any order