Skip to content

Commit

Permalink
Use a sample table for storing the extremas, since it simplifies the …
Browse files Browse the repository at this point in the history
…code somewhat.
  • Loading branch information
schmelter-sap committed Jul 10, 2023
1 parent 8658923 commit ad65dc6
Showing 1 changed file with 18 additions and 20 deletions.
38 changes: 18 additions & 20 deletions src/hotspot/share/vitals/vitals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -642,8 +642,6 @@ class SampleTable : public CHeapObj<mtInternal> {
assert(idx >= 0 && idx <= _num_entries, "invalid index: %d", idx);
return Sample::size_in_bytes() * idx;
}
const Sample* sample_at(int index) const { return (Sample*)((uint8_t*)_samples + sample_offset_in_bytes(index)); }
Sample* sample_at(int index) { return (Sample*)((uint8_t*)_samples + sample_offset_in_bytes(index)); }

public:

Expand All @@ -663,6 +661,9 @@ class SampleTable : public CHeapObj<mtInternal> {

bool is_empty() const { return _head == -1; }

const Sample* sample_at(int index) const { return (Sample*)((uint8_t*)_samples + sample_offset_in_bytes(index)); }
Sample* sample_at(int index) { return (Sample*)((uint8_t*)_samples + sample_offset_in_bytes(index)); }

void add_sample(const Sample* sample) {
// Advance head
_head ++;
Expand Down Expand Up @@ -776,8 +777,8 @@ class SampleTables : public CHeapObj<mtInternal> {

SampleTable _short_term_table;
SampleTable _long_term_table;
Sample* _extremum_samples;
Sample* _last_extremum_samples;
SampleTable _extremum_samples;
SampleTable _last_extremum_samples;

int _count;

Expand Down Expand Up @@ -841,8 +842,8 @@ class SampleTables : public CHeapObj<mtInternal> {
SampleTables()
: _short_term_table(short_term_tablesize()),
_long_term_table(long_term_tablesize),
_extremum_samples(NULL),
_last_extremum_samples(NULL),
_extremum_samples(Sample::num_values()),
_last_extremum_samples(Sample::num_values()),
_count(0)
{}

Expand All @@ -867,23 +868,20 @@ class SampleTables : public CHeapObj<mtInternal> {
// Nothing to do yet. We need at least two samples to handle all values in the sample. Just
// allocate the space for the last sample as a marker.
last_sample = (Sample*) NEW_C_HEAP_ARRAY(char, Sample::size_in_bytes(), mtInternal);
} else if (_extremum_samples == NULL) {
// Allocate the two array and initialize it with the first possible samples.
_extremum_samples = (Sample*)NEW_C_HEAP_ARRAY(char, Sample::size_in_bytes() * Sample::num_values(), mtInternal);
_last_extremum_samples = (Sample*) NEW_C_HEAP_ARRAY(char, Sample::size_in_bytes() * Sample::num_values(), mtInternal);

} else if (_extremum_samples.is_empty()) {
//Initialize the extremum tables with the first possible samples.
for (int i = 0; i < Sample::num_values(); ++i) {
::memcpy(i * Sample::size_in_bytes() + (char*) _last_extremum_samples, last_sample, Sample::size_in_bytes());
::memcpy(i * Sample::size_in_bytes() + (char*) _extremum_samples, sample, Sample::size_in_bytes());
_last_extremum_samples.add_sample(last_sample);
_extremum_samples.add_sample(sample);
}
}
else {
// Otherwise iterate columns and update if needed.
for (Column const* column = ColumnList::the_list()->first(); column != NULL; column = column->next()) {
if (column->extremum() != NONE) {
int idx = column->index();
Sample* extremum_sample = (Sample*) (idx * Sample::size_in_bytes() + (char*) _extremum_samples);
Sample* last_extremum_sample = (Sample*) (idx * Sample::size_in_bytes() + (char*) _last_extremum_samples);
Sample* extremum_sample = _extremum_samples.sample_at(idx);
Sample* last_extremum_sample = _last_extremum_samples.sample_at(idx);

bool should_log = (column->extremum() == MAX) && (sample->value(idx) > extremum_sample->value(idx));
should_log |= (column->extremum() == MIN) && (sample->value(idx) < extremum_sample->value(idx));
Expand Down Expand Up @@ -950,15 +948,15 @@ class SampleTables : public CHeapObj<mtInternal> {
dump_stream(st, external_stream);
}

if (StoreVitalsExtremas && (_extremum_samples != NULL) && (_last_extremum_samples != NULL)) {
if (StoreVitalsExtremas && !_extremum_samples.is_empty() && !_last_extremum_samples.is_empty()) {
st->print_cr("Samples at extremes (+ marks a maximum, - marks a minimum)");
ColumnWidths widths;
MeasureColumnWidthsClosure mcwclos(pi, &widths);

for (Column const* column = ColumnList::the_list()->first(); column != NULL; column = column->next()) {
if (column->extremum() != NONE) {
Sample* extremum_sample = (Sample*)(column->index() * Sample::size_in_bytes() + (char*)_extremum_samples);
Sample* last_extremum_sample = (Sample*)(column->index() * Sample::size_in_bytes() + (char*)_last_extremum_samples);
Sample* extremum_sample = _extremum_samples.sample_at(column->index());
Sample* last_extremum_sample = _last_extremum_samples.sample_at(column->index());
widths.update_from_sample(extremum_sample, last_extremum_sample, pi, 1);
}
}
Expand All @@ -967,8 +965,8 @@ class SampleTables : public CHeapObj<mtInternal> {

for (Column const* column = ColumnList::the_list()->first(); column != NULL; column = column->next()) {
if (column->extremum() != NONE) {
Sample* extremum_sample = (Sample*)(column->index() * Sample::size_in_bytes() + (char*)_extremum_samples);
Sample* last_extremum_sample = (Sample*)(column->index() * Sample::size_in_bytes() + (char*)_last_extremum_samples);
Sample* extremum_sample = _extremum_samples.sample_at(column->index());
Sample* last_extremum_sample = _last_extremum_samples.sample_at(column->index());
print_one_sample(st, extremum_sample, last_extremum_sample, &widths, pi, column->index(), column->extremum() == MIN ? '-' : '+');
}
}
Expand Down

0 comments on commit ad65dc6

Please sign in to comment.