comparison src/share/vm/services/memTrackWorker.cpp @ 7971:4102b59539ce

8005012: Add WB APIs to better support NMT testing Summary: Add WB API functions to enable better NMT testing Reviewed-by: dholmes, zgu
author ctornqvi
date Fri, 01 Feb 2013 23:48:08 +0100
parents ecd24264898b
children 35f8765422b9
comparison
equal deleted inserted replaced
7962:4c75576d18d0 7971:4102b59539ce
89 this->initialize_thread_local_storage(); 89 this->initialize_thread_local_storage();
90 this->record_stack_base_and_size(); 90 this->record_stack_base_and_size();
91 MemSnapshot* snapshot = MemTracker::get_snapshot(); 91 MemSnapshot* snapshot = MemTracker::get_snapshot();
92 assert(snapshot != NULL, "Worker should not be started"); 92 assert(snapshot != NULL, "Worker should not be started");
93 MemRecorder* rec; 93 MemRecorder* rec;
94 unsigned long processing_generation = 0;
95 bool worker_idle = false;
94 96
95 while (!MemTracker::shutdown_in_progress()) { 97 while (!MemTracker::shutdown_in_progress()) {
96 NOT_PRODUCT(_last_gen_in_use = generations_in_use();) 98 NOT_PRODUCT(_last_gen_in_use = generations_in_use();)
97 { 99 {
98 // take a recorder from earliest generation in buffer 100 // take a recorder from earliest generation in buffer
99 ThreadCritical tc; 101 ThreadCritical tc;
100 rec = _gen[_head].next_recorder(); 102 rec = _gen[_head].next_recorder();
101 } 103 }
102 if (rec != NULL) { 104 if (rec != NULL) {
105 if (rec->get_generation() != processing_generation || worker_idle) {
106 processing_generation = rec->get_generation();
107 worker_idle = false;
108 MemTracker::set_current_processing_generation(processing_generation);
109 }
110
103 // merge the recorder into staging area 111 // merge the recorder into staging area
104 if (!snapshot->merge(rec)) { 112 if (!snapshot->merge(rec)) {
105 MemTracker::shutdown(MemTracker::NMT_out_of_memory); 113 MemTracker::shutdown(MemTracker::NMT_out_of_memory);
106 } else { 114 } else {
107 NOT_PRODUCT(_merge_count ++;) 115 NOT_PRODUCT(_merge_count ++;)
127 if (!snapshot->promote(number_of_classes)) { 135 if (!snapshot->promote(number_of_classes)) {
128 // failed to promote, means out of memory 136 // failed to promote, means out of memory
129 MemTracker::shutdown(MemTracker::NMT_out_of_memory); 137 MemTracker::shutdown(MemTracker::NMT_out_of_memory);
130 } 138 }
131 } else { 139 } else {
140 // worker thread is idle
141 worker_idle = true;
142 MemTracker::report_worker_idle();
132 snapshot->wait(1000); 143 snapshot->wait(1000);
133 ThreadCritical tc; 144 ThreadCritical tc;
134 // check if more data arrived 145 // check if more data arrived
135 if (!_gen[_head].has_more_recorder()) { 146 if (!_gen[_head].has_more_recorder()) {
136 _gen[_head].add_recorders(MemTracker::get_pending_recorders()); 147 _gen[_head].add_recorders(MemTracker::get_pending_recorders());