104 oop pending_obj = (pending_monitor != NULL ? (oop) pending_monitor->object() : NULL); |
104 oop pending_obj = (pending_monitor != NULL ? (oop) pending_monitor->object() : NULL); |
105 oop waiting_obj = (waiting_monitor != NULL ? (oop) waiting_monitor->object() : NULL); |
105 oop waiting_obj = (waiting_monitor != NULL ? (oop) waiting_monitor->object() : NULL); |
106 |
106 |
107 for (int index = (mons->length()-1); index >= 0; index--) { |
107 for (int index = (mons->length()-1); index >= 0; index--) { |
108 MonitorInfo* monitor = mons->at(index); |
108 MonitorInfo* monitor = mons->at(index); |
|
109 if (monitor->eliminated() && is_compiled_frame()) continue; // skip eliminated monitor |
109 oop obj = monitor->owner(); |
110 oop obj = monitor->owner(); |
110 if (obj == NULL) continue; // skip unowned monitor |
111 if (obj == NULL) continue; // skip unowned monitor |
111 // |
112 // |
112 // Skip the monitor that the thread is blocked to enter or waiting on |
113 // Skip the monitor that the thread is blocked to enter or waiting on |
113 // |
114 // |
160 GrowableArray<MonitorInfo*>* mons = monitors(); |
161 GrowableArray<MonitorInfo*>* mons = monitors(); |
161 if (!mons->is_empty()) { |
162 if (!mons->is_empty()) { |
162 bool found_first_monitor = false; |
163 bool found_first_monitor = false; |
163 for (int index = (mons->length()-1); index >= 0; index--) { |
164 for (int index = (mons->length()-1); index >= 0; index--) { |
164 MonitorInfo* monitor = mons->at(index); |
165 MonitorInfo* monitor = mons->at(index); |
|
166 if (monitor->eliminated() && is_compiled_frame()) { // Eliminated in compiled code |
|
167 if (monitor->owner_is_scalar_replaced()) { |
|
168 Klass* k = Klass::cast(monitor->owner_klass()); |
|
169 st->print("\t- eliminated <owner is scalar replaced> (a %s)", k->external_name()); |
|
170 } else { |
|
171 oop obj = monitor->owner(); |
|
172 if (obj != NULL) { |
|
173 print_locked_object_class_name(st, obj, "eliminated"); |
|
174 } |
|
175 } |
|
176 continue; |
|
177 } |
165 if (monitor->owner() != NULL) { |
178 if (monitor->owner() != NULL) { |
166 |
179 |
167 // First, assume we have the monitor locked. If we haven't found an |
180 // First, assume we have the monitor locked. If we haven't found an |
168 // owned monitor before and this is the first frame, then we need to |
181 // owned monitor before and this is the first frame, then we need to |
169 // see if we have completed the lock or we are blocked trying to |
182 // see if we have completed the lock or we are blocked trying to |
170 // acquire it - we can only be blocked if the monitor is inflated |
183 // acquire it - we can only be blocked if the monitor is inflated |
171 |
184 |
172 const char *lock_state = "locked"; // assume we have the monitor locked |
185 const char *lock_state = "locked"; // assume we have the monitor locked |
173 if (!found_first_monitor && frame_count == 0) { |
186 if (!found_first_monitor && frame_count == 0) { |
174 markOop mark = monitor->owner()->mark(); |
187 markOop mark = monitor->owner()->mark(); |
175 if (mark->has_monitor() && |
188 if (mark->has_monitor() && |
176 mark->monitor() == thread()->current_pending_monitor()) { |
189 mark->monitor() == thread()->current_pending_monitor()) { |
177 lock_state = "waiting to lock"; |
190 lock_state = "waiting to lock"; |
178 } |
191 } |
179 } |
192 } |
180 |
193 |
181 found_first_monitor = true; |
194 found_first_monitor = true; |
182 print_locked_object_class_name(st, monitor->owner(), lock_state); |
195 print_locked_object_class_name(st, monitor->owner(), lock_state); |
183 } |
196 } |
204 GrowableArray<MonitorInfo*>* interpretedVFrame::monitors() const { |
217 GrowableArray<MonitorInfo*>* interpretedVFrame::monitors() const { |
205 GrowableArray<MonitorInfo*>* result = new GrowableArray<MonitorInfo*>(5); |
218 GrowableArray<MonitorInfo*>* result = new GrowableArray<MonitorInfo*>(5); |
206 for (BasicObjectLock* current = (fr().previous_monitor_in_interpreter_frame(fr().interpreter_frame_monitor_begin())); |
219 for (BasicObjectLock* current = (fr().previous_monitor_in_interpreter_frame(fr().interpreter_frame_monitor_begin())); |
207 current >= fr().interpreter_frame_monitor_end(); |
220 current >= fr().interpreter_frame_monitor_end(); |
208 current = fr().previous_monitor_in_interpreter_frame(current)) { |
221 current = fr().previous_monitor_in_interpreter_frame(current)) { |
209 result->push(new MonitorInfo(current->obj(), current->lock(), false)); |
222 result->push(new MonitorInfo(current->obj(), current->lock(), false, false)); |
210 } |
223 } |
211 return result; |
224 return result; |
212 } |
225 } |
213 |
226 |
214 int interpretedVFrame::bci() const { |
227 int interpretedVFrame::bci() const { |
529 GrowableArray<MonitorInfo*>* list = monitors(); |
542 GrowableArray<MonitorInfo*>* list = monitors(); |
530 if (list->is_empty()) return; |
543 if (list->is_empty()) return; |
531 tty->print_cr("\tmonitor list:"); |
544 tty->print_cr("\tmonitor list:"); |
532 for (int index = (list->length()-1); index >= 0; index--) { |
545 for (int index = (list->length()-1); index >= 0; index--) { |
533 MonitorInfo* monitor = list->at(index); |
546 MonitorInfo* monitor = list->at(index); |
534 tty->print("\t obj\t"); monitor->owner()->print_value(); |
547 tty->print("\t obj\t"); |
535 tty->print("(" INTPTR_FORMAT ")", (address)monitor->owner()); |
548 if (monitor->owner_is_scalar_replaced()) { |
|
549 Klass* k = Klass::cast(monitor->owner_klass()); |
|
550 tty->print("( is scalar replaced %s)", k->external_name()); |
|
551 } else if (monitor->owner() == NULL) { |
|
552 tty->print("( null )"); |
|
553 } else { |
|
554 monitor->owner()->print_value(); |
|
555 tty->print("(" INTPTR_FORMAT ")", (address)monitor->owner()); |
|
556 } |
|
557 if (monitor->eliminated() && is_compiled_frame()) |
|
558 tty->print(" ( lock is eliminated )"); |
536 tty->cr(); |
559 tty->cr(); |
537 tty->print("\t "); |
560 tty->print("\t "); |
538 monitor->lock()->print_on(tty); |
561 monitor->lock()->print_on(tty); |
539 tty->cr(); |
562 tty->cr(); |
540 } |
563 } |