52 ShenandoahPhaseTimings::ShenandoahPhaseTimings(uint max_workers) :
53 _max_workers(max_workers) {
54 assert(_max_workers > 0, "Must have some GC threads");
55
56 // Initialize everything to sane defaults
57 for (uint i = 0; i < _num_phases; i++) {
58 #define SHENANDOAH_WORKER_DATA_NULL(type, title) \
59 _worker_data[i] = NULL;
60 SHENANDOAH_PAR_PHASE_DO(,, SHENANDOAH_WORKER_DATA_NULL)
61 #undef SHENANDOAH_WORKER_DATA_NULL
62 _cycle_data[i] = uninitialized();
63 }
64
65 // Then punch in the worker-related data.
66 // Every worker phase get a bunch of internal objects, except
67 // the very first slot, which is "<total>" and is not populated.
68 for (uint i = 0; i < _num_phases; i++) {
69 if (is_worker_phase(Phase(i))) {
70 int c = 0;
71 #define SHENANDOAH_WORKER_DATA_INIT(type, title) \
72 if (c++ != 0) _worker_data[i + c] = new ShenandoahWorkerData(title, _max_workers);
73 SHENANDOAH_PAR_PHASE_DO(,, SHENANDOAH_WORKER_DATA_INIT)
74 #undef SHENANDOAH_WORKER_DATA_INIT
75 }
76 }
77
78 _policy = ShenandoahHeap::heap()->shenandoah_policy();
79 assert(_policy != NULL, "Can not be NULL");
80 }
81
82 ShenandoahPhaseTimings::Phase ShenandoahPhaseTimings::worker_par_phase(Phase phase, ParPhase par_phase) {
83 assert(is_worker_phase(phase), "Phase should accept worker phase times: %s", phase_name(phase));
84 Phase p = Phase(phase + 1 + par_phase);
85 assert(p >= 0 && p < _num_phases, "Out of bound for: %s", phase_name(phase));
86 return p;
87 }
88
89 ShenandoahWorkerData* ShenandoahPhaseTimings::worker_data(Phase phase, ParPhase par_phase) {
90 Phase p = worker_par_phase(phase, par_phase);
91 ShenandoahWorkerData* wd = _worker_data[p];
92 assert(wd != NULL, "Counter initialized: %s", phase_name(p));
|
52 ShenandoahPhaseTimings::ShenandoahPhaseTimings(uint max_workers) :
53 _max_workers(max_workers) {
54 assert(_max_workers > 0, "Must have some GC threads");
55
56 // Initialize everything to sane defaults
57 for (uint i = 0; i < _num_phases; i++) {
58 #define SHENANDOAH_WORKER_DATA_NULL(type, title) \
59 _worker_data[i] = NULL;
60 SHENANDOAH_PAR_PHASE_DO(,, SHENANDOAH_WORKER_DATA_NULL)
61 #undef SHENANDOAH_WORKER_DATA_NULL
62 _cycle_data[i] = uninitialized();
63 }
64
65 // Then punch in the worker-related data.
66 // Every worker phase get a bunch of internal objects, except
67 // the very first slot, which is "<total>" and is not populated.
68 for (uint i = 0; i < _num_phases; i++) {
69 if (is_worker_phase(Phase(i))) {
70 int c = 0;
71 #define SHENANDOAH_WORKER_DATA_INIT(type, title) \
72 if (c++ != 0) _worker_data[i + c] = new ShenandoahWorkerData(NULL, title, _max_workers);
73 SHENANDOAH_PAR_PHASE_DO(,, SHENANDOAH_WORKER_DATA_INIT)
74 #undef SHENANDOAH_WORKER_DATA_INIT
75 }
76 }
77
78 _policy = ShenandoahHeap::heap()->shenandoah_policy();
79 assert(_policy != NULL, "Can not be NULL");
80 }
81
82 ShenandoahPhaseTimings::Phase ShenandoahPhaseTimings::worker_par_phase(Phase phase, ParPhase par_phase) {
83 assert(is_worker_phase(phase), "Phase should accept worker phase times: %s", phase_name(phase));
84 Phase p = Phase(phase + 1 + par_phase);
85 assert(p >= 0 && p < _num_phases, "Out of bound for: %s", phase_name(phase));
86 return p;
87 }
88
89 ShenandoahWorkerData* ShenandoahPhaseTimings::worker_data(Phase phase, ParPhase par_phase) {
90 Phase p = worker_par_phase(phase, par_phase);
91 ShenandoahWorkerData* wd = _worker_data[p];
92 assert(wd != NULL, "Counter initialized: %s", phase_name(p));
|