>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