< prev index next >
src/share/vm/gc/shared/gcTimer.hpp
Print this page
rev 9733 : [mq]: webrev.00
*** 37,55 ****
template <class E> class GrowableArray;
class PhaseVisitor {
public:
virtual void visit(GCPhase* phase) = 0;
- virtual void visit(PausePhase* phase) { visit((GCPhase*)phase); }
- virtual void visit(ConcurrentPhase* phase) { visit((GCPhase*)phase); }
};
class GCPhase {
const char* _name;
int _level;
Ticks _start;
Ticks _end;
public:
void set_name(const char* name) { _name = name; }
const char* name() const { return _name; }
--- 37,61 ----
template <class E> class GrowableArray;
class PhaseVisitor {
public:
virtual void visit(GCPhase* phase) = 0;
};
class GCPhase {
+ public:
+ enum PhaseType {
+ PausePhaseType = 0,
+ ConcurrentPhaseType = 1
+ };
+
+ private:
const char* _name;
int _level;
Ticks _start;
Ticks _end;
+ PhaseType _type;
public:
void set_name(const char* name) { _name = name; }
const char* name() const { return _name; }
*** 60,88 ****
void set_start(const Ticks& time) { _start = time; }
const Ticks end() const { return _end; }
void set_end(const Ticks& time) { _end = time; }
! virtual void accept(PhaseVisitor* visitor) = 0;
! };
!
! class PausePhase : public GCPhase {
! public:
! void accept(PhaseVisitor* visitor) {
! visitor->visit(this);
! }
! };
- class ConcurrentPhase : public GCPhase {
void accept(PhaseVisitor* visitor) {
visitor->visit(this);
}
};
class PhasesStack {
public:
! // FIXME: Temporary set to 5 (used to be 4), since Reference processing needs it.
static const int PHASE_LEVELS = 5;
private:
int _phase_indices[PHASE_LEVELS];
int _next_phase_level;
--- 66,86 ----
void set_start(const Ticks& time) { _start = time; }
const Ticks end() const { return _end; }
void set_end(const Ticks& time) { _end = time; }
! PhaseType type() const { return _type; }
! void set_type(PhaseType type) { _type = type; }
void accept(PhaseVisitor* visitor) {
visitor->visit(this);
}
};
class PhasesStack {
public:
! // Set to 5, since Reference processing needs it.
static const int PHASE_LEVELS = 5;
private:
int _phase_indices[PHASE_LEVELS];
int _next_phase_level;
*** 97,128 ****
};
class TimePartitions {
static const int INITIAL_CAPACITY = 10;
! // Currently we only support pause phases.
! GrowableArray<PausePhase>* _phases;
PhasesStack _active_phases;
Tickspan _sum_of_pauses;
Tickspan _longest_pause;
public:
TimePartitions();
~TimePartitions();
void clear();
! void report_gc_phase_start(const char* name, const Ticks& time);
! void report_gc_phase_end(const Ticks& time);
int num_phases() const;
GCPhase* phase_at(int index) const;
const Tickspan sum_of_pauses() const { return _sum_of_pauses; }
const Tickspan longest_pause() const { return _longest_pause; }
bool has_active_phases();
private:
void update_statistics(GCPhase* phase);
};
class PhasesIterator {
--- 95,126 ----
};
class TimePartitions {
static const int INITIAL_CAPACITY = 10;
! GrowableArray<GCPhase>* _phases;
PhasesStack _active_phases;
Tickspan _sum_of_pauses;
Tickspan _longest_pause;
public:
TimePartitions();
~TimePartitions();
void clear();
! void report_gc_phase_start(const char* name, const Ticks& time, GCPhase::PhaseType type=GCPhase::PausePhaseType);
! void report_gc_phase_end(const Ticks& time, GCPhase::PhaseType type=GCPhase::PausePhaseType);
int num_phases() const;
GCPhase* phase_at(int index) const;
const Tickspan sum_of_pauses() const { return _sum_of_pauses; }
const Tickspan longest_pause() const { return _longest_pause; }
bool has_active_phases();
+
private:
void update_statistics(GCPhase* phase);
};
class PhasesIterator {
*** 160,172 ****
--- 158,181 ----
virtual void register_gc_start(const Ticks& time = Ticks::now());
virtual void register_gc_end(const Ticks& time = Ticks::now());
};
class ConcurrentGCTimer : public GCTimer {
+ // ConcurrentGCTimer can't be used if there is an overlap between a pause phase and a concurrent phase.
+ // _is_concurrent_phase_active is used to find above case.
+ NOT_PRODUCT(volatile bool _is_concurrent_phase_active;)
+
public:
+ #ifndef PRODUCT
+ ConcurrentGCTimer(): GCTimer(), _is_concurrent_phase_active(false) {};
+ #endif
+
void register_gc_pause_start(const char* name);
void register_gc_pause_end();
+
+ void register_gc_concurrent_start(const char* name, const Ticks& time = Ticks::now());
+ void register_gc_concurrent_end(const Ticks& time = Ticks::now());
};
class TimePartitionPhasesIterator {
TimePartitions* _time_partitions;
int _next;
< prev index next >