X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fvm.c;h=b2a8f9f58294ac770f3250939bb4538f9d08cd8c;hb=21540cc0b2778478b3b057150a86149ad2a20f99;hp=8f11af6f601f7a074441aee582780a2264256554;hpb=2387631c383529898674ff25d076735457bd94cc;p=cacao.git diff --git a/src/vm/vm.c b/src/vm/vm.c index 8f11af6f6..b2a8f9f58 100644 --- a/src/vm/vm.c +++ b/src/vm/vm.c @@ -1,4 +1,4 @@ -/* src/vm/finalizer.c - finalizer linked list and thread +/* src/vm/vm.c - VM startup and shutdown functions Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring, @@ -28,7 +28,7 @@ Changes: Martin Platter - $Id: finalizer.c 4357 2006-01-22 23:33:38Z twisti $ + $Id: vm.c 4357 2006-01-22 23:33:38Z twisti $ */ @@ -45,15 +45,11 @@ #include "native/jni.h" #include "native/native.h" -#if defined(USE_THREADS) -# if defined(NATIVE_THREADS) -# include "threads/native/threads.h" -# else -# include "threads/green/threads.h" -# include "threads/green/locks.h" -# endif +#if defined(ENABLE_THREADS) +# include "threads/native/threads.h" #endif +#include "toolbox/util.h" #include "vm/classcache.h" #include "vm/exceptions.h" #include "vm/finalizer.h" @@ -67,6 +63,9 @@ #include "vm/vm.h" #include "vm/jit/jit.h" #include "vm/jit/asmpart.h" + +#include "vm/jit/recompile.h" + #include "vm/jit/profile/profile.h" #include "vm/rt-timing.h" @@ -74,6 +73,7 @@ #include "native/jvmti/cacaodbg.h" #endif + /* Invocation API variables ***************************************************/ _Jv_JavaVM *_Jv_jvm; /* denotes a Java VM */ @@ -91,8 +91,6 @@ bool vm_exiting = false; u1 *intrp_main_stack = NULL; #endif -void **stackbottom = NULL; - char *mainstring = NULL; classinfo *mainclass = NULL; @@ -104,9 +102,9 @@ bool startit = true; /* define heap sizes **********************************************************/ -#define HEAP_MAXSIZE 64 * 1024 * 1024 /* default 64MB */ -#define HEAP_STARTSIZE 2 * 1024 * 1024 /* default 2MB */ -#define STACK_SIZE 128 * 1024 /* default 128kB */ +#define HEAP_MAXSIZE 128 * 1024 * 1024 /* default 128MB */ +#define HEAP_STARTSIZE 2 * 1024 * 1024 /* default 2MB */ +#define STACK_SIZE 64 * 1024 /* default 64kB */ /* define command line options ************************************************/ @@ -131,6 +129,9 @@ enum { OPT_HELP, OPT_X, + OPT_ESA, + OPT_DSA, + /* Java non-standard options */ OPT_JIT, @@ -140,6 +141,8 @@ enum { OPT_BOOTCLASSPATH_A, OPT_BOOTCLASSPATH_P, + OPT_GLIBJ, + OPT_PROF, OPT_PROF_OPTION, @@ -224,6 +227,7 @@ opt_struct opts[] = { { "d64", false, OPT_D64 }, { "client", false, OPT_IGNORE }, { "server", false, OPT_IGNORE }, + { "jvm", false, OPT_IGNORE }, { "hotspot", false, OPT_IGNORE }, { "classpath", true, OPT_CLASSPATH }, @@ -236,6 +240,11 @@ opt_struct opts[] = { { "?", false, OPT_HELP }, { "X", false, OPT_X }, + { "esa", false, OPT_ESA }, + { "enablesystemassertions", false, OPT_ESA }, + { "dsa", false, OPT_DSA }, + { "disablesystemassertions", false, OPT_DSA }, + { "noasyncgc", false, OPT_IGNORE }, #if defined(ENABLE_VERIFIER) { "noverify", false, OPT_NOVERIFY }, @@ -293,11 +302,14 @@ opt_struct opts[] = { { "Xbootclasspath:", true, OPT_BOOTCLASSPATH }, { "Xbootclasspath/a:", true, OPT_BOOTCLASSPATH_A }, { "Xbootclasspath/p:", true, OPT_BOOTCLASSPATH_P }, + { "Xglibj:", true, OPT_GLIBJ }, + #ifdef ENABLE_JVMTI { "Xdebug", false, OPT_DEBUG }, { "Xnoagent", false, OPT_NOAGENT }, { "Xrunjdwp", true, OPT_XRUNJDWP }, #endif + { "Xms", true, OPT_MS }, { "ms", true, OPT_MS }, { "Xmx", true, OPT_MX }, @@ -337,6 +349,7 @@ void usage(void) puts(" -d64 use 64-bit data model if available"); puts(" -client compatibility (currently ignored)"); puts(" -server compatibility (currently ignored)"); + puts(" -jvm compatibility (currently ignored)"); puts(" -hotspot compatibility (currently ignored)\n"); puts(" -cp specify a path to look for classes"); @@ -347,16 +360,23 @@ void usage(void) puts(" -fullversion print jpackage-compatible product version and exit"); puts(" -showversion print product version and continue"); puts(" -help, -? print this help message"); - puts(" -X print help on non-standard Java options\n"); + puts(" -X print help on non-standard Java options"); + puts(" -esa | -enablesystemassertions"); + puts(" enable system assertions"); + puts(" -dsa | -disablesystemassertions"); + puts(" disable system assertions"); + puts(""); #ifdef ENABLE_JVMTI puts(" -agentlib:= library to load containg JVMTI agent"); + puts (" for jdwp help use: -agentlib:jdwp=help"); puts(" -agentpath:= path to library containg JVMTI agent"); #endif - puts("CACAO options:\n"); + puts("CACAO options:"); puts(" -v write state-information"); - puts(" -verbose[:call|exception]enable specific verbose output"); + puts(" -verbose[:call|exception|jit]"); + puts(" enable specific verbose output"); #ifdef TYPECHECK_VERBOSE puts(" -verbosetc write debug messages while typechecking"); #endif @@ -382,14 +402,17 @@ void usage(void) puts(" -all compile all methods, no execution"); puts(" -m compile only a specific method"); puts(" -sig specify signature for a specific method"); - puts(" -s(how)a(ssembler) show disassembled listing"); - puts(" c(onstants) show the constant pool"); - puts(" d(atasegment) show data segment listing"); - puts(" e(xceptionstubs) show disassembled exception stubs (only with -sa)"); - puts(" i(ntermediate) show intermediate representation"); - puts(" m(ethods) show class fields and methods"); - puts(" n(ative) show disassembled native stubs"); - puts(" u(tf) show the utf - hash"); + puts(" -s(how)... show..."); + puts(" c(onstants) the constant pool"); + puts(" m(ethods) class fields and methods"); + puts(" u(tf) the utf - hash"); + puts(" i(ntermediate) intermediate representation"); +#if defined(ENABLE_DISASSEMBLER) + puts(" a(ssembler) disassembled listing"); + puts(" e(xceptionstubs) disassembled exception stubs (only with -sa)"); + puts(" n(ative) disassembled native stubs"); +#endif + puts(" d(atasegment) data segment listing"); #if defined(ENABLE_INLINING) puts(" -i n(line) activate inlining"); puts(" v(irtual) inline virtual methods (uses/turns rt option on)"); @@ -424,16 +447,19 @@ static void Xusage(void) puts(" value is appended to the bootstrap class path"); puts(" -Xbootclasspath/p:"); puts(" value is prepended to the bootstrap class path"); - puts(" -Xms set the initial size of the heap (default: 2MB)"); - puts(" -Xmx set the maximum size of the heap (default: 64MB)"); - puts(" -Xss set the thread stack size (default: 128kB)"); + puts(" -Xglibj:"); + puts(" value is used as Java core library, but the"); + puts(" hardcoded VM interface classes are prepended"); + printf(" -Xms set the initial size of the heap (default: %dMB)\n", HEAP_STARTSIZE / 1024 / 1024); + printf(" -Xmx set the maximum size of the heap (default: %dMB)\n", HEAP_MAXSIZE / 1024 / 1024); + printf(" -Xss set the thread stack size (default: %dkB)\n", STACK_SIZE / 1024); puts(" -Xprof[:bb] collect and print profiling data"); #if defined(ENABLE_JVMTI) /* -Xdebug option depend on gnu classpath JDWP options. options: transport=dt_socket,address=,server=(y|n),suspend(y|n) */ - puts(" -Xdebug enable remote debugging\n"); + puts(" -Xdebug enable remote debugging\n"); puts(" -Xrunjdwp transport=[dt_socket|...],address=,server=[y|n],suspend=[y|n]\n"); - puts(" enable remote debugging\n"); + puts(" enable remote debugging\n"); #endif /* exit with error code */ @@ -448,7 +474,7 @@ static void Xusage(void) *******************************************************************************/ -static void version(void) +static void version(bool opt_exit) { puts("java version \""JAVA_VERSION"\""); puts("CACAO version "VERSION""); @@ -475,7 +501,25 @@ static void version(void) #else puts(" CC : "VERSION_CC""); #endif - puts(" CFLAGS : "VERSION_CFLAGS""); + puts(" CFLAGS : "VERSION_CFLAGS"\n"); + + puts("Default variables:\n"); + printf(" maximum heap size : %d\n", HEAP_MAXSIZE); + printf(" initial heap size : %d\n", HEAP_STARTSIZE); + printf(" stack size : %d\n", STACK_SIZE); + puts(" java.boot.class.path: "CACAO_VM_ZIP":"CLASSPATH_GLIBJ_ZIP""); + puts(" java.library.path : "CLASSPATH_LIBRARY_PATH"\n"); + + puts("Runtime variables:\n"); + printf(" maximum heap size : %d\n", opt_heapmaxsize); + printf(" initial heap size : %d\n", opt_heapstartsize); + printf(" stack size : %d\n", opt_stacksize); + printf(" java.boot.class.path: %s\n", bootclasspath); + + /* exit normally, if requested */ + + if (opt_exit) + exit(0); } @@ -506,19 +550,17 @@ bool vm_create(JavaVMInitArgs *vm_args) { char *cp; s4 cplen; - u4 heapmaxsize; - u4 heapstartsize; s4 opt; s4 i, j, k; - + bool opt_version; + bool opt_exit; #if defined(ENABLE_JVMTI) lt_dlhandle handle; - char* libname; - bool agentbypath = false;; + char *libname, *agentarg; + bool jdwp,agentbypath; + jdwp = agentbypath = false; #endif - - /* check the JNI version requested */ @@ -537,6 +579,9 @@ bool vm_create(JavaVMInitArgs *vm_args) if (vms > 0) return false; + /* set the VM starttime */ + + _Jv_jvm->starttime = util_current_time_millis(); /* get stuff from the environment *****************************************/ @@ -544,7 +589,6 @@ bool vm_create(JavaVMInitArgs *vm_args) nogc_init(HEAP_MAXSIZE, HEAP_STARTSIZE); #endif - /* set the bootclasspath */ cp = getenv("BOOTCLASSPATH"); @@ -554,18 +598,17 @@ bool vm_create(JavaVMInitArgs *vm_args) strcpy(bootclasspath, cp); } else { - cplen = strlen(CACAO_VM_ZIP_PATH) + + cplen = strlen(CACAO_VM_ZIP) + strlen(":") + - strlen(CLASSPATH_GLIBJ_ZIP_PATH) + + strlen(CLASSPATH_GLIBJ_ZIP) + strlen("0"); bootclasspath = MNEW(char, cplen); - strcat(bootclasspath, CACAO_VM_ZIP_PATH); + strcat(bootclasspath, CACAO_VM_ZIP); strcat(bootclasspath, ":"); - strcat(bootclasspath, CLASSPATH_GLIBJ_ZIP_PATH); + strcat(bootclasspath, CLASSPATH_GLIBJ_ZIP); } - /* set the classpath */ cp = getenv("CLASSPATH"); @@ -581,18 +624,21 @@ bool vm_create(JavaVMInitArgs *vm_args) /* interpret the options **************************************************/ - - checknull = false; - opt_noieee = false; - heapmaxsize = HEAP_MAXSIZE; - heapstartsize = HEAP_STARTSIZE; - opt_stacksize = STACK_SIZE; + opt_version = false; + opt_exit = false; + + checknull = false; + opt_noieee = false; + + opt_heapmaxsize = HEAP_MAXSIZE; + opt_heapstartsize = HEAP_STARTSIZE; + opt_stacksize = STACK_SIZE; #if defined(ENABLE_JVMTI) /* initialize JVMTI related **********************************************/ - jdwp = jvmti = false; + jvmti = false; #endif /* initialize properties before commandline handling */ @@ -601,6 +647,11 @@ bool vm_create(JavaVMInitArgs *vm_args) throw_cacao_exception_exit(string_java_lang_InternalError, "Unable to init properties"); + /* add some default properties */ + + properties_add("java.endorsed.dirs", ""CACAO_PREFIX"/jre/lib/endorsed"); + + /* iterate over all passed options */ while ((opt = options_get(opts, vm_args)) != OPT_DONE) { @@ -639,20 +690,21 @@ bool vm_create(JavaVMInitArgs *vm_args) if (opt_arg[j] == '=') { opt_arg[j] = '\0'; properties_add(opt_arg, opt_arg + j + 1); - goto didit; + goto opt_d_done; } } /* if no '=' is given, just create an empty property */ properties_add(opt_arg, ""); - - didit: + + opt_d_done: break; case OPT_BOOTCLASSPATH: /* Forget default bootclasspath and set the argument as new boot classpath. */ + MFREE(bootclasspath, char, strlen(bootclasspath)); bootclasspath = MNEW(char, strlen(opt_arg) + strlen("0")); @@ -661,6 +713,7 @@ bool vm_create(JavaVMInitArgs *vm_args) case OPT_BOOTCLASSPATH_A: /* append to end of bootclasspath */ + cplen = strlen(bootclasspath); bootclasspath = MREALLOC(bootclasspath, @@ -675,6 +728,7 @@ bool vm_create(JavaVMInitArgs *vm_args) case OPT_BOOTCLASSPATH_P: /* prepend in front of bootclasspath */ + cp = bootclasspath; cplen = strlen(cp); @@ -688,38 +742,38 @@ bool vm_create(JavaVMInitArgs *vm_args) MFREE(cp, char, cplen); break; + case OPT_GLIBJ: + /* use as Java core library, but prepend VM interface classes */ + + MFREE(bootclasspath, char, strlen(bootclasspath)); + + cplen = strlen(CACAO_VM_ZIP) + + strlen(":") + + strlen(opt_arg) + + strlen("0"); + + bootclasspath = MNEW(char, cplen); + + strcpy(bootclasspath, CACAO_VM_ZIP); + strcat(bootclasspath, ":"); + strcat(bootclasspath, opt_arg); + break; + #if defined(ENABLE_JVMTI) case OPT_DEBUG: - jdwp=true; + /* this option exists only for compatibility reasons */ break; case OPT_NOAGENT: /* I don't know yet what Xnoagent should do. This is only for compatiblity with eclipse - motse */ break; case OPT_XRUNJDWP: - transport = opt_arg; - j=0; - while (transport[j]!='=') j++; - j++; - while (j/lib directory ? */ + snprintf(agentarg,i,"/usr/local/cacao/lib/libjdwp.so=%s",&opt_arg[1]); break; - case OPT_AGENTPATH: agentbypath = true; case OPT_AGENTLIB: @@ -745,9 +799,9 @@ bool vm_create(JavaVMInitArgs *vm_args) j = atoi(opt_arg); if (opt == OPT_MX) - heapmaxsize = j; + opt_heapmaxsize = j; else if (opt == OPT_MS) - heapstartsize = j; + opt_heapstartsize = j; else opt_stacksize = j; } @@ -788,8 +842,8 @@ bool vm_create(JavaVMInitArgs *vm_args) #endif case OPT_VERSION: - version(); - exit(0); + opt_version = true; + opt_exit = true; break; case OPT_FULLVERSION: @@ -797,7 +851,7 @@ bool vm_create(JavaVMInitArgs *vm_args) break; case OPT_SHOWVERSION: - version(); + opt_version = true; break; case OPT_NOIEEE: @@ -872,32 +926,42 @@ bool vm_create(JavaVMInitArgs *vm_args) case OPT_SHOW: /* Display options */ for (j = 0; j < strlen(opt_arg); j++) { switch (opt_arg[j]) { - case 'a': - opt_showdisassemble = true; - compileverbose = true; - break; case 'c': showconstantpool = true; break; - case 'd': - opt_showddatasegment = true; + + case 'u': + showutf = true; break; - case 'e': - opt_showexceptionstubs = true; + + case 'm': + showmethods = true; break; + case 'i': opt_showintermediate = true; compileverbose = true; break; - case 'm': - showmethods = true; + +#if defined(ENABLE_DISASSEMBLER) + case 'a': + opt_showdisassemble = true; + compileverbose = true; + break; + + case 'e': + opt_showexceptionstubs = true; break; + case 'n': opt_shownativestub = true; break; - case 'u': - showutf = true; +#endif + + case 'd': + opt_showddatasegment = true; break; + default: usage(); } @@ -958,6 +1022,14 @@ bool vm_create(JavaVMInitArgs *vm_args) Xusage(); break; + case OPT_ESA: + _Jv_jvm->Java_java_lang_VMClassLoader_defaultAssertionStatus = true; + break; + + case OPT_DSA: + _Jv_jvm->Java_java_lang_VMClassLoader_defaultAssertionStatus = false; + break; + case OPT_PROF_OPTION: /* use <= to get the last \0 too */ @@ -1033,6 +1105,13 @@ bool vm_create(JavaVMInitArgs *vm_args) } + /* Now we have all options handled and we can print the version + information. */ + + if (opt_version) + version(opt_exit); + + /* get the main class *****************************************************/ if (opt_index < vm_args->nOptions) { @@ -1062,10 +1141,12 @@ bool vm_create(JavaVMInitArgs *vm_args) #if defined(ENABLE_JVMTI) if (jvmti) { - set_jvmti_phase(JVMTI_PHASE_ONLOAD); - agentload(agentarg, agentbypath, &handle, &libname); + jvmti_set_phase(JVMTI_PHASE_ONLOAD); + jvmti_agentload(agentarg, agentbypath, &handle, &libname); + if (jdwp) MFREE(agentarg,char,strlen(agentarg)); + jvmti_set_phase(JVMTI_PHASE_PRIMORDIAL); } - set_jvmti_phase(JVMTI_PHASE_PRIMORDIAL); + #endif @@ -1075,7 +1156,7 @@ bool vm_create(JavaVMInitArgs *vm_args) /* initialize the garbage collector */ - gc_init(heapmaxsize, heapstartsize); + gc_init(opt_heapmaxsize, opt_heapstartsize); #if defined(ENABLE_INTRP) /* Allocate main thread stack on the Java heap. */ @@ -1086,12 +1167,9 @@ bool vm_create(JavaVMInitArgs *vm_args) } #endif -#if defined(USE_THREADS) -#if defined(NATIVE_THREADS) +#if defined(ENABLE_THREADS) threads_preinit(); #endif - lock_init(); -#endif /* initialize the string hashtable stuff: lock (must be done _after_ threads_preinit) */ @@ -1160,7 +1238,7 @@ bool vm_create(JavaVMInitArgs *vm_args) /* initialize the loader subsystems (must be done _after_ classcache_init) */ - if (!loader_init((u1 *) stackbottom)) + if (!loader_init()) throw_main_exception_exit(); if (!linker_init()) @@ -1182,8 +1260,8 @@ bool vm_create(JavaVMInitArgs *vm_args) if (!jni_init()) throw_main_exception_exit(); -#if defined(USE_THREADS) - if (!threads_init((u1 *) stackbottom)) +#if defined(ENABLE_THREADS) + if (!threads_init()) throw_main_exception_exit(); #endif @@ -1202,16 +1280,30 @@ bool vm_create(JavaVMInitArgs *vm_args) throw_main_exception_exit(); #endif -#if defined(USE_THREADS) + /* initialize recompilation */ + + if (!recompile_init()) + throw_main_exception_exit(); + +#if defined(ENABLE_THREADS) /* finally, start the finalizer thread */ if (!finalizer_start_thread()) throw_main_exception_exit(); + /* start the recompilation thread (must be done before the + profiling thread) */ + + if (!recompile_start_thread()) + throw_main_exception_exit(); + +# if defined(ENABLE_PROFILING) /* start the profile sampling thread */ -/* if (!profile_start_thread()) */ -/* throw_main_exception_exit(); */ + if (opt_prof) + if (!profile_start_thread()) + throw_main_exception_exit(); +# endif #endif #if defined(ENABLE_JVMTI) @@ -1243,12 +1335,8 @@ bool vm_create(JavaVMInitArgs *vm_args) s4 vm_destroy(JavaVM *vm) { -#if defined(USE_THREADS) -#if defined(NATIVE_THREADS) - joinAllThreads(); -#else - killThread(currentThread); -#endif +#if defined(ENABLE_THREADS) + threads_join_all_threads(); #endif /* everything's ok */ @@ -1275,8 +1363,10 @@ void vm_exit(s4 status) assert(class_java_lang_System->state & CLASS_LOADED); #if defined(ENABLE_JVMTI) - set_jvmti_phase(JVMTI_PHASE_DEAD); - if (jvmti) agentunload(); + if (jvmti || (dbgcom!=NULL)) { + jvmti_set_phase(JVMTI_PHASE_DEAD); + if (jvmti) jvmti_agentunload(); + } #endif if (!link_class(class_java_lang_System)) @@ -1321,8 +1411,19 @@ void vm_shutdown(s4 status) { log_text("CACAO terminated by shutdown"); dolog("Exit status: %d\n", (s4) status); + } +#if defined(ENABLE_JVMTI) + /* terminate cacaodbgserver */ + if (dbgcom!=NULL) { + pthread_mutex_lock(&dbgcomlock); + dbgcom->running=1; + pthread_mutex_unlock(&dbgcomlock); + jvmti_cacaodbgserver_quit(); + } +#endif + exit(status); } @@ -1355,11 +1456,6 @@ void vm_exit_handler(void) # endif #endif /* !defined(NDEBUG) */ -#if defined(USE_THREADS) && !defined(NATIVE_THREADS) - clear_thread_flags(); /* restores standard file descriptor - flags */ -#endif - #if defined(ENABLE_RT_TIMING) rt_timing_print_time_stats(stderr); #endif @@ -1395,6 +1491,32 @@ void vm_exit_handler(void) } +/* vm_abort ******************************************************************** + + Prints an error message and aborts the VM. + +*******************************************************************************/ + +void vm_abort(const char *text, ...) +{ + va_list ap; + + /* print the log message */ + + log_start(); + + va_start(ap, text); + log_vprint(text, ap); + va_end(ap); + + log_finish(); + + /* now abort the VM */ + + abort(); +} + + /* vm_vmargs_from_valist ******************************************************* XXX