jboolean rvmInitMethods(Env* env) { if (rvmInitMutex(&nativeLibsLock) != 0) { return FALSE; } if (rvmInitMutex(&threadStackTraceLock) != 0) { return FALSE; } java_lang_StackTraceElement = rvmFindClassUsingLoader(env, "java/lang/StackTraceElement", NULL); if (!java_lang_StackTraceElement) { return FALSE; } java_lang_StackTraceElement_constructor = rvmGetInstanceMethod(env, java_lang_StackTraceElement, "<init>", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V"); if (!java_lang_StackTraceElement_constructor) { return FALSE; } empty_java_lang_StackTraceElement_array = rvmNewObjectArray(env, 0, java_lang_StackTraceElement, NULL, NULL); if (!empty_java_lang_StackTraceElement_array) { return FALSE; } if (!rvmAddObjectGCRoot(env, (Object*) empty_java_lang_StackTraceElement_array)) { return FALSE; } return TRUE; }
jboolean initGC(Options* options) { GC_set_no_dls(1); GC_set_java_finalization(1); GC_INIT(); if (options->maxHeapSize > 0) { GC_set_max_heap_size(options->maxHeapSize); } if (options->initialHeapSize > 0) { size_t now = GC_get_heap_size(); if (options->initialHeapSize > now) { GC_expand_hp(options->initialHeapSize - now); } } objectGCKind = GC_new_kind(GC_new_free_list(), GC_MAKE_PROC(GC_new_proc(markObject), 0), 0, 1); largeArrayGCKind = GC_new_kind(GC_new_free_list(), GC_DS_LENGTH, 1, 1); atomicObjectGCKind = GC_new_kind(GC_new_free_list(), GC_DS_LENGTH, 0, 1); referentEntryGCKind = gcNewDirectBitmapKind(REFERENT_ENTRY_GC_BITMAP); if (rvmInitMutex(&referentsLock) != 0) { return FALSE; } if (rvmInitMutex(&gcRootsLock) != 0) { return FALSE; } GC_set_warn_proc(gcWarnProc); return TRUE; }
static jboolean initThread(Env* env, Thread* thread, JavaThread* threadObj) { // NOTE: threadsLock must be held int err = 0; pthread_cond_init(&thread->waitCond, NULL); if ((err = rvmInitMutex(&thread->waitMutex)) != 0) { rvmThrowInternalErrorErrno(env, err); return FALSE; } thread->threadId = nextThreadId++; thread->threadObj = threadObj; threadObj->threadPtr = PTR_TO_LONG(thread); env->currentThread = thread; env->attachCount = 1; return TRUE; }
jboolean rvmInitThreads(Env* env) { if (rvmInitMutex(&threadsLock) != 0) return FALSE; if (pthread_key_create(&tlsEnvKey, NULL) != 0) return FALSE; if (pthread_cond_init(&threadStartCond, NULL) != 0) return FALSE; if (pthread_cond_init(&threadsChangedCond, NULL) != 0) return FALSE; getUncaughtExceptionHandlerMethod = rvmGetInstanceMethod2(env, java_lang_Thread, "getUncaughtExceptionHandler", "()Ljava/lang/Thread$UncaughtExceptionHandler;"); if (!getUncaughtExceptionHandlerMethod) return FALSE; Class* uncaughtExceptionHandler = rvmFindClassInClasspathForLoader(env, "java/lang/Thread$UncaughtExceptionHandler", NULL); if (!uncaughtExceptionHandler) return FALSE; uncaughtExceptionMethod = rvmGetInstanceMethod2(env, uncaughtExceptionHandler, "uncaughtException", "(Ljava/lang/Thread;Ljava/lang/Throwable;)V"); if (!uncaughtExceptionMethod) return FALSE; removeThreadMethod = rvmGetInstanceMethod2(env, java_lang_ThreadGroup, "removeThread", "(Ljava/lang/Thread;)V"); if (!removeThreadMethod) return FALSE; return attachThread(env->vm, &env, "main", NULL, FALSE) == JNI_OK; }
jboolean initGC(Options* options) { GC_INIT(); GC_set_java_finalization(1); if (options->maxHeapSize > 0) { GC_set_max_heap_size(options->maxHeapSize); } if (options->initialHeapSize > 0) { size_t now = GC_get_heap_size(); if (options->initialHeapSize > now) { GC_expand_hp(options->initialHeapSize - now); } } object_gc_kind = GC_new_kind(GC_new_free_list(), GC_MAKE_PROC(GC_new_proc(markObject), 0), 0, 1); if (rvmInitMutex(&referentsLock) != 0) { return FALSE; } return TRUE; }
jboolean rvmInitClasses(Env* env) { if (rvmInitMutex(&classLock) != 0) { return FALSE; } // Cache important classes in java.lang. java_lang_Object = findBootClass(env, "java/lang/Object"); if (!java_lang_Object) return FALSE; java_lang_Class = findBootClass(env, "java/lang/Class"); if (!java_lang_Class) return FALSE; // Fix object.clazz pointers for the classes loaded so far rvmIterateLoadedClasses(env, fixClassPointer, NULL); java_lang_ClassLoader = findBootClass(env, "java/lang/ClassLoader"); if (!java_lang_ClassLoader) return FALSE; java_lang_String = findBootClass(env, "java/lang/String"); if (!java_lang_String) return FALSE; java_lang_Boolean = findBootClass(env, "java/lang/Boolean"); if (!java_lang_Boolean) return FALSE; java_lang_Byte = findBootClass(env, "java/lang/Byte"); if (!java_lang_Byte) return FALSE; java_lang_Character = findBootClass(env, "java/lang/Character"); if (!java_lang_Character) return FALSE; java_lang_Short = findBootClass(env, "java/lang/Short"); if (!java_lang_Short) return FALSE; java_lang_Integer = findBootClass(env, "java/lang/Integer"); if (!java_lang_Integer) return FALSE; java_lang_Long = findBootClass(env, "java/lang/Long"); if (!java_lang_Long) return FALSE; java_lang_Float = findBootClass(env, "java/lang/Float"); if (!java_lang_Float) return FALSE; java_lang_Double = findBootClass(env, "java/lang/Double"); if (!java_lang_Double) return FALSE; java_lang_Enum = findBootClass(env, "java/lang/Enum"); if (!java_lang_Enum) return FALSE; java_lang_Cloneable = findBootClass(env, "java/lang/Cloneable"); if (!java_lang_Cloneable) return FALSE; java_lang_Thread = findBootClass(env, "java/lang/Thread"); if (!java_lang_Thread) return FALSE; java_lang_ThreadGroup = findBootClass(env, "java/lang/ThreadGroup"); if (!java_lang_ThreadGroup) return FALSE; java_io_Serializable = findBootClass(env, "java/io/Serializable"); if (!java_io_Serializable) return FALSE; java_lang_Runtime = findBootClass(env, "java/lang/Runtime"); if (!java_lang_Runtime) return FALSE; java_lang_ClassNotFoundException = findBootClass(env, "java/lang/ClassNotFoundException"); if (!java_lang_ClassNotFoundException) return FALSE; java_lang_NoClassDefFoundError = findBootClass(env, "java/lang/NoClassDefFoundError"); if (!java_lang_NoClassDefFoundError) return FALSE; java_lang_Error = findBootClass(env, "java/lang/Error"); if (!java_lang_Error) return FALSE; java_lang_OutOfMemoryError = findBootClass(env, "java/lang/OutOfMemoryError"); if (!java_lang_OutOfMemoryError) return FALSE; java_lang_IllegalAccessError = findBootClass(env, "java/lang/IllegalAccessError"); if (!java_lang_IllegalAccessError) return FALSE; java_lang_NoSuchFieldError = findBootClass(env, "java/lang/NoSuchFieldError"); if (!java_lang_NoSuchFieldError) return FALSE; java_lang_NoSuchMethodError = findBootClass(env, "java/lang/NoSuchMethodError"); if (!java_lang_NoSuchMethodError) return FALSE; java_lang_IncompatibleClassChangeError = findBootClass(env, "java/lang/IncompatibleClassChangeError"); if (!java_lang_IncompatibleClassChangeError) return FALSE; java_lang_AbstractMethodError = findBootClass(env, "java/lang/AbstractMethodError"); if (!java_lang_AbstractMethodError) return FALSE; java_lang_UnsatisfiedLinkError = findBootClass(env, "java/lang/UnsatisfiedLinkError"); if (!java_lang_UnsatisfiedLinkError) return FALSE; java_lang_ExceptionInInitializerError = findBootClass(env, "java/lang/ExceptionInInitializerError"); if (!java_lang_ExceptionInInitializerError) return FALSE; java_lang_VerifyError = findBootClass(env, "java/lang/VerifyError"); if (!java_lang_VerifyError) return FALSE; java_lang_LinkageError = findBootClass(env, "java/lang/LinkageError"); if (!java_lang_LinkageError) return FALSE; java_lang_InstantiationError = findBootClass(env, "java/lang/InstantiationError"); if (!java_lang_InstantiationError) return FALSE; java_lang_StackOverflowError = findBootClass(env, "java/lang/StackOverflowError"); if (!java_lang_StackOverflowError) return FALSE; java_lang_InternalError = findBootClass(env, "java/lang/InternalError"); if (!java_lang_InternalError) return FALSE; java_lang_Throwable = findBootClass(env, "java/lang/Throwable"); if (!java_lang_Throwable) return FALSE; java_lang_RuntimeException = findBootClass(env, "java/lang/RuntimeException"); if (!java_lang_RuntimeException) return FALSE; java_lang_ClassCastException = findBootClass(env, "java/lang/ClassCastException"); if (!java_lang_ClassCastException) return FALSE; java_lang_NullPointerException = findBootClass(env, "java/lang/NullPointerException"); if (!java_lang_NullPointerException) return FALSE; java_lang_ArrayIndexOutOfBoundsException = findBootClass(env, "java/lang/ArrayIndexOutOfBoundsException"); if (!java_lang_ArrayIndexOutOfBoundsException) return FALSE; java_lang_ArrayStoreException = findBootClass(env, "java/lang/ArrayStoreException"); if (!java_lang_ArrayStoreException) return FALSE; java_lang_NegativeArraySizeException = findBootClass(env, "java/lang/NegativeArraySizeException"); if (!java_lang_NegativeArraySizeException) return FALSE; java_lang_IllegalArgumentException = findBootClass(env, "java/lang/IllegalArgumentException"); if (!java_lang_IllegalArgumentException) return FALSE; java_lang_ArithmeticException = findBootClass(env, "java/lang/ArithmeticException"); if (!java_lang_ArithmeticException) return FALSE; java_lang_UnsupportedOperationException = findBootClass(env, "java/lang/UnsupportedOperationException"); if (!java_lang_UnsupportedOperationException) return FALSE; java_lang_IllegalMonitorStateException = findBootClass(env, "java/lang/IllegalMonitorStateException"); if (!java_lang_IllegalMonitorStateException) return FALSE; java_lang_InstantiationException = findBootClass(env, "java/lang/InstantiationException"); if (!java_lang_InstantiationException) return FALSE; java_lang_InterruptedException = findBootClass(env, "java/lang/InterruptedException"); if (!java_lang_InterruptedException) return FALSE; java_lang_IllegalStateException = findBootClass(env, "java/lang/IllegalStateException"); if (!java_lang_IllegalStateException) return FALSE; prim_Z = createPrimitiveClass(env, "Z"); if (!prim_Z) return FALSE; prim_B = createPrimitiveClass(env, "B"); if (!prim_B) return FALSE; prim_C = createPrimitiveClass(env, "C"); if (!prim_C) return FALSE; prim_S = createPrimitiveClass(env, "S"); if (!prim_S) return FALSE; prim_I = createPrimitiveClass(env, "I"); if (!prim_I) return FALSE; prim_J = createPrimitiveClass(env, "J"); if (!prim_J) return FALSE; prim_F = createPrimitiveClass(env, "F"); if (!prim_F) return FALSE; prim_D = createPrimitiveClass(env, "D"); if (!prim_D) return FALSE; prim_V = createPrimitiveClass(env, "V"); if (!prim_V) return FALSE; array_Z = findBootClass(env, "[Z"); if (!array_Z) return FALSE; array_B = findBootClass(env, "[B"); if (!array_B) return FALSE; array_C = findBootClass(env, "[C"); if (!array_C) return FALSE; array_S = findBootClass(env, "[S"); if (!array_S) return FALSE; array_I = findBootClass(env, "[I"); if (!array_I) return FALSE; array_J = findBootClass(env, "[J"); if (!array_J) return FALSE; array_F = findBootClass(env, "[F"); if (!array_F) return FALSE; array_D = findBootClass(env, "[D"); if (!array_D) return FALSE; return TRUE; }