>From 378eb758000abec2526f065bdd8808a3fc705801 Mon Sep 17 00:00:00 2001
From: Vegard Nossum <vegard.nos...@gmail.com>
Date: Fri, 26 Jun 2009 17:00:10 +0200
Subject: [PATCH] vm: provide classloader tracing with -Xtrace:classloader

The output looks like this:

classloader: java/lang/System
classloader: java/io/BufferedInputStream
classloader:  java/io/FilterInputStream
classloader:   java/io/InputStream
classloader:    java/lang/Object

Signed-off-by: Vegard Nossum <vegard.nos...@gmail.com>
---
 include/vm/classloader.h |    2 ++
 vm/classloader.c         |   38 ++++++++++++++++++++++++++++++++++----
 vm/jato.c                |    2 ++
 3 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/include/vm/classloader.h b/include/vm/classloader.h
index bea1bd1..0fe25d6 100644
--- a/include/vm/classloader.h
+++ b/include/vm/classloader.h
@@ -1,6 +1,8 @@
 #ifndef __VM_CLASSLOADER_H
 #define __VM_CLASSLOADER_H
 
+extern bool opt_trace_classloader;
+
 struct vm_class;
 
 int classloader_add_to_classpath(const char *classpath);
diff --git a/vm/classloader.c b/vm/classloader.c
index 784dd56..1ce3cf9 100644
--- a/vm/classloader.c
+++ b/vm/classloader.c
@@ -12,6 +12,28 @@
 #include <vm/classloader.h>
 #include <vm/java_lang.h>
 
+bool opt_trace_classloader;
+static int trace_classloader_level = 0;
+
+static inline void trace_push(const char *class_name)
+{
+       assert(trace_classloader_level >= 0);
+
+       if (opt_trace_classloader) {
+               fprintf(stderr, "classloader: %*s%s\n",
+                       trace_classloader_level, "", class_name);
+       }
+
+       ++trace_classloader_level;
+}
+
+static inline void trace_pop()
+{
+       assert(trace_classloader_level >= 1);
+
+       --trace_classloader_level;
+}
+
 struct classpath {
        struct list_head node;
 
@@ -407,14 +429,19 @@ struct vm_class *classloader_load(const char *class_name)
        struct classloader_class *new_array;
        unsigned long new_max_classes;
 
+       trace_push(class_name);
+
        class = lookup_class(class_name);
-       if (class)
-               return class->class;
+       if (class) {
+               vmc = class->class;
+               goto out;
+       }
 
        vmc = load_class(class_name);
        if (!vmc) {
                NOT_IMPLEMENTED;
-               return NULL;
+               vmc = NULL;
+               goto out;
        }
 
        if (nr_classes == max_classes) {        
@@ -423,7 +450,8 @@ struct vm_class *classloader_load(const char *class_name)
                        new_max_classes * sizeof(struct classloader_class));
                if (!new_array) {
                        NOT_IMPLEMENTED;
-                       return NULL;
+                       vmc = NULL;
+                       goto out;
                }
 
                max_classes = new_max_classes;
@@ -433,6 +461,8 @@ struct vm_class *classloader_load(const char *class_name)
        class = &classes[nr_classes++];
        class->class = vmc;
 
+out:
+       trace_pop();
        return vmc;
 }
 
diff --git a/vm/jato.c b/vm/jato.c
index 5e91cbf..7f297a2 100644
--- a/vm/jato.c
+++ b/vm/jato.c
@@ -237,6 +237,8 @@ main(int argc, char *argv[])
                        opt_trace_machine_code = true;
                } else if (!strcmp(argv[i], "-Xtrace:bytecode-offset")) {
                        opt_trace_bytecode_offset = true;
+               } else if (!strcmp(argv[i], "-Xtrace:classloader")) {
+                       opt_trace_classloader = true;
                } else if (!strcmp(argv[i], "-Xtrace:jit")) {
                        opt_trace_method = true;
                        opt_trace_cfg = true;
-- 
1.6.0.4


------------------------------------------------------------------------------
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to