src/share/vm/trace/traceStream.hpp

Print this page
rev 12364 : 8170672: Event-based tracing to support classloader instances
Reviewed-by:

@@ -25,10 +25,12 @@
 #ifndef SHARE_VM_TRACE_TRACESTREAM_HPP
 #define SHARE_VM_TRACE_TRACESTREAM_HPP
 
 #include "utilities/macros.hpp"
 #if INCLUDE_TRACE
+#include "classfile/classLoaderData.hpp"
+#include "classfile/javaClasses.inline.hpp"
 #include "memory/resourceArea.hpp"
 #include "oops/klass.hpp"
 #include "oops/method.hpp"
 #include "oops/symbol.hpp"
 #include "utilities/ostream.hpp"

@@ -99,10 +101,37 @@
       description = val->name_and_sig_as_C_string();
     }
     _st.print("%s = %s", label, description);
   }
 
+  void print_val(const char* label, const ClassLoaderData* const cld) {
+    ResourceMark rm;
+    if (cld == NULL || cld->is_anonymous()) {
+      _st.print("%s = NULL", label);
+      return;
+    }
+    const oop class_loader_oop = cld->class_loader();
+    if (class_loader_oop == NULL) {
+      _st.print("%s = NULL", label);
+      return;
+    }
+    const char* class_loader_name = "NULL";
+    const char* klass_name = "NULL";
+    const oop class_loader_name_oop =
+      java_lang_ClassLoader::name(class_loader_oop);
+    if (class_loader_name_oop != NULL) {
+      class_loader_name =
+        java_lang_String::as_utf8_string(class_loader_name_oop);
+    }
+    const Klass* const k = class_loader_oop->klass();
+    const Symbol* klass_name_sym = k->name();
+    if (klass_name_sym != NULL) {
+      klass_name = klass_name_sym->as_C_string();
+    }
+    _st.print("%s = name=%s class=%s", label, class_loader_name, klass_name);
+  }
+
   void print_val(const char* label, const char* val) {
     _st.print("%s = '%s'", label, val);
   }
 
   void print(const char* val) {