From e2a8e7c8ce8f0bb05339f84de74377b963564461 Mon Sep 17 00:00:00 2001 From: Mats Larsen Date: Tue, 6 Jul 2021 15:11:32 +0200 Subject: [PATCH] Support execution of programs for JVM compilers (#2745) * Bare execution for Java programs * Support execution for Kotlin --- etc/config/java.amazon.properties | 6 ++++++ etc/config/java.defaults.properties | 4 +++- etc/config/kotlin.amazon.properties | 13 ++++++++++++- etc/config/kotlin.defaults.properties | 4 +++- etc/nsjail/sandbox.cfg | 2 +- lib/compilers/java.js | 25 ++++++++++++++++++++++++- lib/compilers/kotlin.js | 4 ++++ 7 files changed, 53 insertions(+), 5 deletions(-) diff --git a/etc/config/java.amazon.properties b/etc/config/java.amazon.properties index 1cbe95b3a..6f709b548 100644 --- a/etc/config/java.amazon.properties +++ b/etc/config/java.amazon.properties @@ -15,34 +15,40 @@ group.java11.compilers=java1102 group.java11.groupName=OpenJDK 11 group.java11.objdumper=/opt/compiler-explorer/jdk-11.0.2/bin/javap compiler.java1102.exe=/opt/compiler-explorer/jdk-11.0.2/bin/javac +compiler.java1102.runtime=/opt/compiler-explorer/jdk-11.0.2/bin/java compiler.java1102.semver=11.0.2 group.java12.compilers=java1201 group.java12.groupName=OpenJDK 12 group.java12.objdumper=/opt/compiler-explorer/jdk-12.0.1/bin/javap compiler.java1201.exe=/opt/compiler-explorer/jdk-12.0.1/bin/javac +compiler.java1201.runtime=/opt/compiler-explorer/jdk-12.0.1/bin/java compiler.java1201.semver=12.0.1 group.java13.compilers=java1302 group.java13.groupName=OpenJDK 13 group.java13.objdumper=/opt/compiler-explorer/jdk-13.0.2/bin/javap compiler.java1302.exe=/opt/compiler-explorer/jdk-13.0.2/bin/javac +compiler.java1302.runtime=/opt/compiler-explorer/jdk-13.0.2/bin/java compiler.java1302.semver=13.0.2 group.java14.compilers=java1402 group.java14.groupName=OpenJDK 14 group.java14.objdumper=/opt/compiler-explorer/jdk-14.0.2/bin/javap compiler.java1402.exe=/opt/compiler-explorer/jdk-14.0.2/bin/javac +compiler.java1402.runtime=/opt/compiler-explorer/jdk-14.0.2/bin/java compiler.java1402.semver=14.0.2 group.java15.compilers=java1502 group.java15.groupName=OpenJDK 15 group.java15.objdumper=/opt/compiler-explorer/jdk-15.0.2/bin/javap compiler.java1502.exe=/opt/compiler-explorer/jdk-15.0.2/bin/javac +compiler.java1502.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java compiler.java1502.semver=15.0.2 group.java16.compilers=java1601 group.java16.groupName=OpenJDK 16 group.java16.objdumper=/opt/compiler-explorer/jdk-16.0.1/bin/javap compiler.java1601.exe=/opt/compiler-explorer/jdk-16.0.1/bin/javac +compiler.java1601.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java compiler.java1601.semver=16.0.1 diff --git a/etc/config/java.defaults.properties b/etc/config/java.defaults.properties index 8a2ee3f77..c54fb2ec9 100644 --- a/etc/config/java.defaults.properties +++ b/etc/config/java.defaults.properties @@ -7,6 +7,7 @@ instructionSet=java group.java.compilers=javacdefault compiler.javacdefault.exe=/usr/bin/javac +compiler.javacdefault.runtime=/usr/bin/java compiler.javacdefault.name=javac default defaultCompiler=javacdefault @@ -15,4 +16,5 @@ postProcess= options= supportsBinary=false needsMulti=false -supportsExecute=false +supportsExecute=true +interpreted=true diff --git a/etc/config/kotlin.amazon.properties b/etc/config/kotlin.amazon.properties index 52cbe63b5..98eb4bef4 100644 --- a/etc/config/kotlin.amazon.properties +++ b/etc/config/kotlin.amazon.properties @@ -9,7 +9,8 @@ postProcess= options= supportsBinary=false needsMulti=false -supportsExecute=false +supportsExecute=true +interpreted=true group.kotlin.compilers=kotlinc1400:kotlinc1410:kotlinc1420:kotlinc1421:kotlinc1430:kotlinc1431:kotlinc1432:kotlinc1500:kotlinc1510:kotlinc1520 group.kotlin.groupName=Kotlin @@ -18,30 +19,40 @@ group.kotlin.isSemVer=true compiler.kotlinc1400.exe=/opt/compiler-explorer/kotlin-jvm-1.4.0/bin/kotlinc-jvm compiler.kotlinc1400.semver=1.4.0 compiler.kotlinc1400.java_home=/opt/compiler-explorer/jdk-15.0.2 +compiler.kotlinc1400.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java compiler.kotlinc1410.exe=/opt/compiler-explorer/kotlin-jvm-1.4.10/bin/kotlinc-jvm compiler.kotlinc1410.semver=1.4.10 compiler.kotlinc1410.java_home=/opt/compiler-explorer/jdk-15.0.2 +compiler.kotlinc1410.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java compiler.kotlinc1420.exe=/opt/compiler-explorer/kotlin-jvm-1.4.20/bin/kotlinc-jvm compiler.kotlinc1420.semver=1.4.20 compiler.kotlinc1420.java_home=/opt/compiler-explorer/jdk-15.0.2 +compiler.kotlinc1420.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java compiler.kotlinc1421.exe=/opt/compiler-explorer/kotlin-jvm-1.4.21/bin/kotlinc-jvm compiler.kotlinc1421.semver=1.4.21 compiler.kotlinc1421.java_home=/opt/compiler-explorer/jdk-15.0.2 +compiler.kotlinc1421.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java compiler.kotlinc1430.exe=/opt/compiler-explorer/kotlin-jvm-1.4.30/bin/kotlinc-jvm compiler.kotlinc1430.semver=1.4.30 compiler.kotlinc1430.java_home=/opt/compiler-explorer/jdk-15.0.2 +compiler.kotlinc1430.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java compiler.kotlinc1431.exe=/opt/compiler-explorer/kotlin-jvm-1.4.31/bin/kotlinc-jvm compiler.kotlinc1431.semver=1.4.31 compiler.kotlinc1431.java_home=/opt/compiler-explorer/jdk-15.0.2 +compiler.kotlinc1431.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java compiler.kotlinc1432.exe=/opt/compiler-explorer/kotlin-jvm-1.4.32/bin/kotlinc-jvm compiler.kotlinc1432.semver=1.4.32 compiler.kotlinc1432.java_home=/opt/compiler-explorer/jdk-15.0.2 +compiler.kotlinc1432.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java compiler.kotlinc1500.exe=/opt/compiler-explorer/kotlin-jvm-1.5.0/bin/kotlinc-jvm compiler.kotlinc1500.semver=1.5.0 compiler.kotlinc1500.java_home=/opt/compiler-explorer/jdk-16.0.1 +compiler.kotlinc1500.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java compiler.kotlinc1510.exe=/opt/compiler-explorer/kotlin-jvm-1.5.10/bin/kotlinc-jvm compiler.kotlinc1510.semver=1.5.10 compiler.kotlinc1510.java_home=/opt/compiler-explorer/jdk-16.0.1 +compiler.kotlinc1510.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java compiler.kotlinc1520.exe=/opt/compiler-explorer/kotlin-jvm-1.5.20/bin/kotlinc-jvm compiler.kotlinc1520.semver=1.5.20 compiler.kotlinc1520.java_home=/opt/compiler-explorer/jdk-16.0.1 +compiler.kotlinc1520.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java diff --git a/etc/config/kotlin.defaults.properties b/etc/config/kotlin.defaults.properties index 374dc6965..f8ebf6106 100644 --- a/etc/config/kotlin.defaults.properties +++ b/etc/config/kotlin.defaults.properties @@ -8,6 +8,7 @@ instructionSet=java group.kotlin.compilers=kotlincdefault compiler.kotlincdefault.exe=/usr/bin/kotlinc-jvm compiler.kotlincdefault.name=kotlinc default +compiler.kotlincdefault.runtime=/usr/bin/java defaultCompiler=kotlincdefault demangler= @@ -15,4 +16,5 @@ postProcess= options= supportsBinary=false needsMulti=false -supportsExecute=false +supportsExecute=true +interpreted=true diff --git a/etc/nsjail/sandbox.cfg b/etc/nsjail/sandbox.cfg index 790f66c48..3d2b518d1 100644 --- a/etc/nsjail/sandbox.cfg +++ b/etc/nsjail/sandbox.cfg @@ -28,7 +28,7 @@ cgroup_net_cls_parent: "ce-sandbox" cgroup_cpu_parent: "ce-sandbox" cgroup_mem_max: 209715200 # 200 MiB -cgroup_pids_max: 4 +cgroup_pids_max: 14 cgroup_cpu_ms_per_sec: 500 mount { diff --git a/lib/compilers/java.js b/lib/compilers/java.js index c61cc8f65..3f6b9d184 100644 --- a/lib/compilers/java.js +++ b/lib/compilers/java.js @@ -42,8 +42,8 @@ export class JavaCompiler extends BaseCompiler { if (!compilerInfo.disabledFilters) { compilerInfo.disabledFilters = ['labels', 'directives', 'commentOnly', 'trim']; } - super(compilerInfo, env); + this.javaRuntime = this.compilerProps(`compiler.${this.compiler.id}.runtime`); } getSharedLibraryPathsAsArguments() { @@ -103,6 +103,29 @@ export class JavaCompiler extends BaseCompiler { ]; } + async handleInterpreting(key, executeParameters) { + executeParameters.args = [ + '-Xss136K', // Reduce thread stack size + '-XX:CICompilerCount=2', // Reduce JIT compilation threads. 2 is minimum + '-XX:-UseDynamicNumberOfCompilerThreads', + '-XX:-UseDynamicNumberOfGCThreads', + '-XX:+UseSerialGC', // Disable parallell/concurrent garbage collector + this.getMainClassName(), + ...executeParameters.args, + ]; + const buildResult = await this.getOrBuildExecutable(key); + const dirPath = path.dirname(buildResult.executableFilename); + const result = await this.runExecutable(this.javaRuntime, executeParameters, dirPath); + result.didExecute = true; + result.buildResult = buildResult; + return result; + } + + getMainClassName() { + // TODO(supergrecko): The main class name is currently hardcoded + return 'Main'; + } + getArgumentParser() { return JavaParser; } diff --git a/lib/compilers/kotlin.js b/lib/compilers/kotlin.js index a7e21f796..030cdcfd5 100644 --- a/lib/compilers/kotlin.js +++ b/lib/compilers/kotlin.js @@ -40,6 +40,10 @@ export class KotlinCompiler extends JavaCompiler { return execOptions; } + getMainClassName() { + return 'ExampleKt'; + } + filterUserOptions(userOptions) { // filter options without extra arguments userOptions = userOptions.filter(option =>