public void initializeAtRuntime() { if (SubstrateOptions.MultiThreaded.getValue()) { compileQueue = new BackgroundCompileQueue(); RuntimeSupport.getRuntimeSupport().addTearDownHook(this::tearDown); } if (TruffleRuntimeOptions.getValue(SharedTruffleRuntimeOptions.TraceTruffleTransferToInterpreter)) { if (!SubstrateOptions.IncludeNodeSourcePositions.getValue()) { System.out.println("Warning: TraceTruffleTransferToInterpreter cannot print stack traces. Build image with -H:+IncludeNodeSourcePositions to enable stack traces."); } RuntimeOptionValues.singleton().update(Deoptimizer.Options.TraceDeoptimization, true); } updateGraalArchitectureWithHostCPUFeatures(getTruffleCompiler().getBackend()); installDefaultListeners(); }
dispatchThread.setDaemon(true); dispatchThread.start(); RuntimeSupport.getRuntimeSupport().addTearDownHook(() -> DispatchThread.interrupt(dispatchThread));
public JNINativeInterface getGlobalFunctionTable() { JNINativeInterface functionTable = globalFunctionTable.get(); if (functionTable.isNull()) { functionTable = UnmanagedMemory.malloc(SizeOf.get(JNINativeInterface.class)); functionTableInitializer.initialize(functionTable); if (globalFunctionTable.compareAndSet(WordFactory.nullPointer(), functionTable)) { RuntimeSupport.getRuntimeSupport().addTearDownHook(() -> UnmanagedMemory.free(globalFunctionTable.get())); } else { // lost the race UnmanagedMemory.free(functionTable); functionTable = globalFunctionTable.get(); } } return functionTable; }
@CEntryPoint(name = "JNI_CreateJavaVM") @CEntryPointOptions(prologue = JNICreateJavaVMPrologue.class, publishAs = Publish.SymbolOnly, include = CEntryPointOptions.NotIncludedAutomatically.class) static int JNI_CreateJavaVM(JNIJavaVMPointer vmBuf, JNIEnvironmentPointer penv, JNIJavaVMInitArgs vmArgs) { // NOTE: could check version, extra options (-verbose etc.), hooks etc. if (vmArgs.isNonNull()) { Pointer p = (Pointer) vmArgs.getOptions(); int count = vmArgs.getNOptions(); ArrayList<String> options = new ArrayList<>(count); for (int i = 0; i < count; i++) { JNIJavaVMOption option = (JNIJavaVMOption) p.add(i * SizeOf.get(JNIJavaVMOption.class)); CCharPointer str = option.getOptionString(); if (str.isNonNull()) { options.add(CTypeConversion.toJavaString(option.getOptionString())); } } RuntimeOptionParser.parseAndConsumeAllOptions(options.toArray(new String[0])); } JNIJavaVM javavm = JNIFunctionTables.singleton().getGlobalJavaVM(); JNIJavaVMList.addJavaVM(javavm); RuntimeSupport.getRuntimeSupport().addTearDownHook(new Runnable() { @Override public void run() { JNIJavaVMList.removeJavaVM(javavm); } }); vmBuf.write(javavm); penv.write(JNIThreadLocalEnvironment.getAddress()); return JNIErrors.JNI_OK(); }
public JNIJavaVM getGlobalJavaVM() { if (globalJavaVM.isNull()) { JNIInvokeInterface invokes = UnmanagedMemory.calloc(SizeOf.get(JNIInvokeInterface.class)); invokesInitializer.initialize(invokes); invokes.setIsolate(CurrentIsolate.getIsolate()); globalJavaVM = UnmanagedMemory.calloc(SizeOf.get(JNIJavaVM.class)); globalJavaVM.setFunctions(invokes); RuntimeSupport.getRuntimeSupport().addTearDownHook(() -> { UnmanagedMemory.free(globalJavaVM.getFunctions()); UnmanagedMemory.free(globalJavaVM); globalJavaVM = WordFactory.nullPointer(); }); } return globalJavaVM; }