Mercurial > hg > graal-jvmci-8
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()); |