--- a/hotspot/src/share/vm/runtime/thread.cpp Tue Mar 10 19:56:19 2015 -0700
+++ b/hotspot/src/share/vm/runtime/thread.cpp Fri Mar 13 12:40:39 2015 -0400
@@ -203,8 +203,6 @@
// This initial value ==> never claimed.
_oops_do_parity = 0;
- _metadata_on_stack_buffer = NULL;
-
// the handle mark links itself to last_handle_mark
new HandleMark(this);
@@ -776,7 +774,8 @@
// no nmethods in a generic thread...
}
-void Thread::metadata_do(void f(Metadata*)) {
+void Thread::metadata_handles_do(void f(Metadata*)) {
+ // Only walk the Handles in Thread.
if (metadata_handles() != NULL) {
for (int i = 0; i< metadata_handles()->length(); i++) {
f(metadata_handles()->at(i));
@@ -2713,7 +2712,6 @@
}
void JavaThread::metadata_do(void f(Metadata*)) {
- Thread::metadata_do(f);
if (has_last_Java_frame()) {
// Traverse the execution stack to call f() on the methods in the stack
for (StackFrameStream fst(this); !fst.is_done(); fst.next()) {
@@ -4104,6 +4102,21 @@
}
}
+class ThreadHandlesClosure : public ThreadClosure {
+ void (*_f)(Metadata*);
+ public:
+ ThreadHandlesClosure(void f(Metadata*)) : _f(f) {}
+ virtual void do_thread(Thread* thread) {
+ thread->metadata_handles_do(_f);
+ }
+};
+
+void Threads::metadata_handles_do(void f(Metadata*)) {
+ // Only walk the Handles in Thread.
+ ThreadHandlesClosure handles_closure(f);
+ threads_do(&handles_closure);
+}
+
void Threads::deoptimized_wrt_marked_nmethods() {
ALL_JAVA_THREADS(p) {
p->deoptimized_wrt_marked_nmethods();