From d74deb6973d93e4eaf8ab9271673957d0f8d7eae Mon Sep 17 00:00:00 2001 From: Space Walker Date: Fri, 10 Apr 2026 18:16:27 +0200 Subject: [PATCH 1/4] [executors] implement main thread executors in 1.13.2- --- libraries/executors/README.md | 3 + libraries/executors/build.gradle | 5 ++ .../build.gradle | 1 + .../gradle.properties | 6 ++ .../impl/mixin/client/MinecraftMixin.java | 22 +++++ .../mixin/server/MinecraftServerMixin.java | 79 ++++++++++++++++++ .../src/main/resources/fabric.mod.json | 26 ++++++ .../main/resources/osl.executors.classtweaker | 4 + .../main/resources/osl.executors.mixins.json | 17 ++++ .../executors-mc14w02a-mc14w06b/build.gradle | 1 + .../gradle.properties | 6 ++ .../impl/mixin/client/MinecraftMixin.java | 82 +++++++++++++++++++ .../mixin/server/MinecraftServerMixin.java | 79 ++++++++++++++++++ .../src/main/resources/fabric.mod.json | 26 ++++++ .../main/resources/osl.executors.classtweaker | 4 + .../main/resources/osl.executors.mixins.json | 17 ++++ .../executors-mc14w07a-mc14w20b/build.gradle | 1 + .../gradle.properties | 6 ++ .../impl/mixin/client/MinecraftMixin.java | 22 +++++ .../mixin/server/MinecraftServerMixin.java | 79 ++++++++++++++++++ .../src/main/resources/fabric.mod.json | 26 ++++++ .../main/resources/osl.executors.classtweaker | 4 + .../main/resources/osl.executors.mixins.json | 17 ++++ .../executors-mc14w21a-mc1.13.2/build.gradle | 1 + .../gradle.properties | 5 ++ .../impl/mixin/client/MinecraftMixin.java | 17 ++++ .../mixin/server/MinecraftServerMixin.java | 17 ++++ .../src/main/resources/fabric.mod.json | 26 ++++++ .../main/resources/osl.executors.classtweaker | 4 + .../main/resources/osl.executors.mixins.json | 17 ++++ .../build.gradle | 1 + .../gradle.properties | 6 ++ .../impl/mixin/client/MinecraftMixin.java | 82 +++++++++++++++++++ .../mixin/server/MinecraftServerMixin.java | 79 ++++++++++++++++++ .../src/main/resources/fabric.mod.json | 26 ++++++ .../main/resources/osl.executors.classtweaker | 4 + .../main/resources/osl.executors.mixins.json | 17 ++++ .../build.gradle | 1 + .../gradle.properties | 11 +++ .../impl/mixin/client/MinecraftMixin.java | 82 +++++++++++++++++++ .../mixin/server/MinecraftServerMixin.java | 79 ++++++++++++++++++ .../src/main/resources/fabric.mod.json | 26 ++++++ .../main/resources/osl.executors.classtweaker | 4 + .../main/resources/osl.executors.mixins.json | 17 ++++ libraries/executors/gradle.properties | 6 ++ .../osl/executors/api/Executors.java | 69 ++++++++++++++++ .../osl/executors/api/MainThreadExecutor.java | 12 +++ settings.gradle | 8 ++ 48 files changed, 1150 insertions(+) create mode 100644 libraries/executors/README.md create mode 100644 libraries/executors/build.gradle create mode 100644 libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/build.gradle create mode 100644 libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/gradle.properties create mode 100644 libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java create mode 100644 libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java create mode 100644 libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/fabric.mod.json create mode 100644 libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.classtweaker create mode 100644 libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.mixins.json create mode 100644 libraries/executors/executors-mc14w02a-mc14w06b/build.gradle create mode 100644 libraries/executors/executors-mc14w02a-mc14w06b/gradle.properties create mode 100644 libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java create mode 100644 libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java create mode 100644 libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/fabric.mod.json create mode 100644 libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.classtweaker create mode 100644 libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.mixins.json create mode 100644 libraries/executors/executors-mc14w07a-mc14w20b/build.gradle create mode 100644 libraries/executors/executors-mc14w07a-mc14w20b/gradle.properties create mode 100644 libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java create mode 100644 libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java create mode 100644 libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/fabric.mod.json create mode 100644 libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.classtweaker create mode 100644 libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.mixins.json create mode 100644 libraries/executors/executors-mc14w21a-mc1.13.2/build.gradle create mode 100644 libraries/executors/executors-mc14w21a-mc1.13.2/gradle.properties create mode 100644 libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java create mode 100644 libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java create mode 100644 libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/fabric.mod.json create mode 100644 libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.classtweaker create mode 100644 libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.mixins.json create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc1.7.5/build.gradle create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc1.7.5/gradle.properties create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/fabric.mod.json create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.classtweaker create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.mixins.json create mode 100644 libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/build.gradle create mode 100644 libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/gradle.properties create mode 100644 libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java create mode 100644 libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java create mode 100644 libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/fabric.mod.json create mode 100644 libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/osl.executors.classtweaker create mode 100644 libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/osl.executors.mixins.json create mode 100644 libraries/executors/gradle.properties create mode 100644 libraries/executors/src/main/java/net/ornithemc/osl/executors/api/Executors.java create mode 100644 libraries/executors/src/main/java/net/ornithemc/osl/executors/api/MainThreadExecutor.java diff --git a/libraries/executors/README.md b/libraries/executors/README.md new file mode 100644 index 00000000..5f405a39 --- /dev/null +++ b/libraries/executors/README.md @@ -0,0 +1,3 @@ +# Executors API + +The Executors API provides an interface for main thread and background thread executors. diff --git a/libraries/executors/build.gradle b/libraries/executors/build.gradle new file mode 100644 index 00000000..7bb43400 --- /dev/null +++ b/libraries/executors/build.gradle @@ -0,0 +1,5 @@ +setUpLibrary(project) + +dependencies { + implementation 'com.google.code.gson:gson:2.8.0' +} diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/build.gradle b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/build.gradle new file mode 100644 index 00000000..0a350fdb --- /dev/null +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/gradle.properties b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/gradle.properties new file mode 100644 index 00000000..c30b8b4f --- /dev/null +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/gradle.properties @@ -0,0 +1,6 @@ +min_mc_version = 1.7.6-pre1 +max_mc_version = 1.7.10 +minecraft_dependency = >=1.7.6-rc.1 <=1.7.10 + +minecraft_version = 1.7.10 +nests_build = 6 diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..fa705b78 --- /dev/null +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.executors.impl.mixin.client; + +import java.util.concurrent.Executor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import com.google.common.util.concurrent.ListenableFuture; + +import net.minecraft.client.Minecraft; + +@Mixin(Minecraft.class) +public class MinecraftMixin implements Executor { + + @Shadow + private ListenableFuture executeTask(Runnable task) { return null; } + + @Override + public void execute(Runnable command) { + this.executeTask(command); + } +} diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..1a21087e --- /dev/null +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,79 @@ +package net.ornithemc.osl.executors.impl.mixin.server; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; + +import net.ornithemc.osl.executors.api.Executors; +import net.ornithemc.osl.executors.api.MainThreadExecutor; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "tick", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/fabric.mod.json b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..ade7144b --- /dev/null +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "osl-executors", + "version": "0.1.0-alpha.1+mc1.7.6-pre1-mc1.7.10", + "environment": "*", + "mixins": [ + "osl.executors.mixins.json" + ], + "accessWidener": "osl.executors.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.17.3", + "minecraft": "\u003e\u003d1.7.6-rc.1 \u003c\u003d1.7.10", + "osl-core": "\u003e\u003d0.7.0" + }, + "name": "OSL Executors", + "description": "Interface for main thread and background threads executors.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.classtweaker b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.classtweaker new file mode 100644 index 00000000..30321462 --- /dev/null +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/client/Minecraft java/util/concurrent/Executor +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/executors/api/MainThreadExecutor \ No newline at end of file diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.mixins.json new file mode 100644 index 00000000..8b64f37d --- /dev/null +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.executors.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + "client.MinecraftMixin" + ], + "server": [ + "server.MinecraftServerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/build.gradle b/libraries/executors/executors-mc14w02a-mc14w06b/build.gradle new file mode 100644 index 00000000..0a350fdb --- /dev/null +++ b/libraries/executors/executors-mc14w02a-mc14w06b/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/gradle.properties b/libraries/executors/executors-mc14w02a-mc14w06b/gradle.properties new file mode 100644 index 00000000..51f199a5 --- /dev/null +++ b/libraries/executors/executors-mc14w02a-mc14w06b/gradle.properties @@ -0,0 +1,6 @@ +min_mc_version = 14w02a +max_mc_version = 14w06b +minecraft_dependency = >=1.8-alpha.14.2.a <=18.alpha.14.6.b + +minecraft_version = 14w06b +nests_build = 5 diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..80539e01 --- /dev/null +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,82 @@ +package net.ornithemc.osl.executors.impl.mixin.client; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; + +import net.ornithemc.osl.executors.api.Executors; +import net.ornithemc.osl.executors.api.MainThreadExecutor; + +@Mixin(Minecraft.class) +public class MinecraftMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "runGame", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/TickTimer;advance()V", + shift = Shift.AFTER + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..1a21087e --- /dev/null +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,79 @@ +package net.ornithemc.osl.executors.impl.mixin.server; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; + +import net.ornithemc.osl.executors.api.Executors; +import net.ornithemc.osl.executors.api.MainThreadExecutor; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "tick", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/fabric.mod.json b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..aaa09668 --- /dev/null +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "osl-executors", + "version": "0.1.0-alpha.1+mc14w02a-mc14w06b", + "environment": "*", + "mixins": [ + "osl.executors.mixins.json" + ], + "accessWidener": "osl.executors.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.17.3", + "minecraft": "\u003e\u003d1.8-alpha.14.2.a \u003c\u003d18.alpha.14.6.b", + "osl-core": "\u003e\u003d0.7.0" + }, + "name": "OSL Executors", + "description": "Interface for main thread and background threads executors.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.classtweaker b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.classtweaker new file mode 100644 index 00000000..a8205231 --- /dev/null +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/client/Minecraft net/ornithemc/osl/executors/api/MainThreadExecutor +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/executors/api/MainThreadExecutor \ No newline at end of file diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.mixins.json new file mode 100644 index 00000000..8b64f37d --- /dev/null +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.executors.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + "client.MinecraftMixin" + ], + "server": [ + "server.MinecraftServerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/build.gradle b/libraries/executors/executors-mc14w07a-mc14w20b/build.gradle new file mode 100644 index 00000000..0a350fdb --- /dev/null +++ b/libraries/executors/executors-mc14w07a-mc14w20b/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/gradle.properties b/libraries/executors/executors-mc14w07a-mc14w20b/gradle.properties new file mode 100644 index 00000000..670a8e2e --- /dev/null +++ b/libraries/executors/executors-mc14w07a-mc14w20b/gradle.properties @@ -0,0 +1,6 @@ +min_mc_version = 14w07a +max_mc_version = 14w20b +minecraft_dependency = >=1.8-alpha.14.7.a <=1.8-alpha.14.20.b + +minecraft_version = 14w20b +nests_build = 5 diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..fa705b78 --- /dev/null +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.executors.impl.mixin.client; + +import java.util.concurrent.Executor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import com.google.common.util.concurrent.ListenableFuture; + +import net.minecraft.client.Minecraft; + +@Mixin(Minecraft.class) +public class MinecraftMixin implements Executor { + + @Shadow + private ListenableFuture executeTask(Runnable task) { return null; } + + @Override + public void execute(Runnable command) { + this.executeTask(command); + } +} diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..1a21087e --- /dev/null +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,79 @@ +package net.ornithemc.osl.executors.impl.mixin.server; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; + +import net.ornithemc.osl.executors.api.Executors; +import net.ornithemc.osl.executors.api.MainThreadExecutor; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "tick", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/fabric.mod.json b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..e4a7da74 --- /dev/null +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "osl-executors", + "version": "0.1.0-alpha.1+mc14w07a-mc14w20b", + "environment": "*", + "mixins": [ + "osl.executors.mixins.json" + ], + "accessWidener": "osl.executors.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.17.3", + "minecraft": "\u003e\u003d1.8-alpha.14.7.a \u003c\u003d1.8-alpha.14.20.b", + "osl-core": "\u003e\u003d0.7.0" + }, + "name": "OSL Executors", + "description": "Interface for main thread and background threads executors.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.classtweaker b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.classtweaker new file mode 100644 index 00000000..30321462 --- /dev/null +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/client/Minecraft java/util/concurrent/Executor +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/executors/api/MainThreadExecutor \ No newline at end of file diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.mixins.json new file mode 100644 index 00000000..8b64f37d --- /dev/null +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.executors.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + "client.MinecraftMixin" + ], + "server": [ + "server.MinecraftServerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/build.gradle b/libraries/executors/executors-mc14w21a-mc1.13.2/build.gradle new file mode 100644 index 00000000..0a350fdb --- /dev/null +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/gradle.properties b/libraries/executors/executors-mc14w21a-mc1.13.2/gradle.properties new file mode 100644 index 00000000..4051b4f4 --- /dev/null +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/gradle.properties @@ -0,0 +1,5 @@ +min_mc_version = 14w21a +max_mc_version = 1.13.2 +minecraft_dependency = >=1.8-alpha.14.21.a <=1.13.2 + +minecraft_version = 1.13.2 diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..2a6c1e72 --- /dev/null +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.executors.impl.mixin.client; + +import java.util.concurrent.Executor; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.BlockableEventLoop; + +@Mixin(Minecraft.class) +public class MinecraftMixin implements Executor { + + @Override + public void execute(Runnable command) { + ((BlockableEventLoop) this).executeTask(command); + } +} diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..1ca9840e --- /dev/null +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.executors.impl.mixin.server; + +import java.util.concurrent.Executor; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.BlockableEventLoop; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements Executor { + + @Override + public void execute(Runnable command) { + ((BlockableEventLoop) this).executeTask(command); + } +} diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/fabric.mod.json b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..3bf4c119 --- /dev/null +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "osl-executors", + "version": "0.1.0-alpha.1+mc14w21a-mc1.13.2", + "environment": "*", + "mixins": [ + "osl.executors.mixins.json" + ], + "accessWidener": "osl.executors.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.17.3", + "minecraft": "\u003e\u003d1.8-alpha.14.21.a \u003c\u003d1.13.2", + "osl-core": "\u003e\u003d0.7.0" + }, + "name": "OSL Executors", + "description": "Interface for main thread and background threads executors.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.classtweaker b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.classtweaker new file mode 100644 index 00000000..3d2647fe --- /dev/null +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/client/Minecraft java/util/concurrent/Executor +transitive-inject-interface net/minecraft/server/MinecraftServer java/util/concurrent/Executor \ No newline at end of file diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.mixins.json new file mode 100644 index 00000000..8b64f37d --- /dev/null +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.executors.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + "client.MinecraftMixin" + ], + "server": [ + "server.MinecraftServerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/build.gradle b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/build.gradle new file mode 100644 index 00000000..0a350fdb --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/gradle.properties b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/gradle.properties new file mode 100644 index 00000000..d06d12cf --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/gradle.properties @@ -0,0 +1,6 @@ +min_mc_version = b1.9-pre3-1350 +max_mc_version = 1.7.5 +minecraft_dependency = >=1.0.0-beta.9.0.3 <=1.7.5 + +minecraft_version = 1.7.5 +nests_build = 5 diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..80539e01 --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,82 @@ +package net.ornithemc.osl.executors.impl.mixin.client; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; + +import net.ornithemc.osl.executors.api.Executors; +import net.ornithemc.osl.executors.api.MainThreadExecutor; + +@Mixin(Minecraft.class) +public class MinecraftMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "runGame", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/TickTimer;advance()V", + shift = Shift.AFTER + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..1a21087e --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,79 @@ +package net.ornithemc.osl.executors.impl.mixin.server; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; + +import net.ornithemc.osl.executors.api.Executors; +import net.ornithemc.osl.executors.api.MainThreadExecutor; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "tick", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/fabric.mod.json b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..f27d3e71 --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "osl-executors", + "version": "0.1.0-alpha.1+mcb1.9-pre3-1350-mc1.7.5", + "environment": "*", + "mixins": [ + "osl.executors.mixins.json" + ], + "accessWidener": "osl.executors.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.17.3", + "minecraft": "\u003e\u003d1.0.0-beta.9.0.3 \u003c\u003d1.7.5", + "osl-core": "\u003e\u003d0.7.0" + }, + "name": "OSL Executors", + "description": "Interface for main thread and background threads executors.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.classtweaker b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.classtweaker new file mode 100644 index 00000000..a8205231 --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/client/Minecraft net/ornithemc/osl/executors/api/MainThreadExecutor +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/executors/api/MainThreadExecutor \ No newline at end of file diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.mixins.json new file mode 100644 index 00000000..8b64f37d --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.executors.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + "client.MinecraftMixin" + ], + "server": [ + "server.MinecraftServerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/build.gradle b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/build.gradle new file mode 100644 index 00000000..0a350fdb --- /dev/null +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/gradle.properties b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/gradle.properties new file mode 100644 index 00000000..e754804b --- /dev/null +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/gradle.properties @@ -0,0 +1,11 @@ +min_mc_version = in-20100128-2304 +max_mc_version = b1.9-pre2 +minecraft_dependency = >=0.31.20100128-2304 <=1.0.0-beta.9.0.2 + +minecraft_version = b1.9-pre2 +client_raven_build = 1 +server_raven_build = 1 +client_sparrow_build = 1 +server_sparrow_build = 1 +client_nests_build = 8 +server_nests_build = 5 diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..fa14b7a8 --- /dev/null +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,82 @@ +package net.ornithemc.osl.executors.impl.mixin.client; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; + +import net.ornithemc.osl.executors.api.Executors; +import net.ornithemc.osl.executors.api.MainThreadExecutor; + +@Mixin(Minecraft.class) +public class MinecraftMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "run", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/TickTimer;advance()V", + shift = Shift.AFTER + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..1a21087e --- /dev/null +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,79 @@ +package net.ornithemc.osl.executors.impl.mixin.server; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; + +import net.ornithemc.osl.executors.api.Executors; +import net.ornithemc.osl.executors.api.MainThreadExecutor; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "tick", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/fabric.mod.json b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..e2fd3e97 --- /dev/null +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "osl-executors", + "version": "0.1.0-alpha.1+mcin-20100128-2304-mcb1.9-pre2", + "environment": "*", + "mixins": [ + "osl.executors.mixins.json" + ], + "accessWidener": "osl.executors.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.17.3", + "minecraft": "\u003e\u003d0.31.20100128-2304 \u003c\u003d1.0.0-beta.9.0.2", + "osl-core": "\u003e\u003d0.7.0" + }, + "name": "OSL Executors", + "description": "Interface for main thread and background threads executors.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/osl.executors.classtweaker b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/osl.executors.classtweaker new file mode 100644 index 00000000..a8205231 --- /dev/null +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/osl.executors.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/client/Minecraft net/ornithemc/osl/executors/api/MainThreadExecutor +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/executors/api/MainThreadExecutor \ No newline at end of file diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/osl.executors.mixins.json new file mode 100644 index 00000000..8b64f37d --- /dev/null +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/resources/osl.executors.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.executors.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + "client.MinecraftMixin" + ], + "server": [ + "server.MinecraftServerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/executors/gradle.properties b/libraries/executors/gradle.properties new file mode 100644 index 00000000..5c1603a5 --- /dev/null +++ b/libraries/executors/gradle.properties @@ -0,0 +1,6 @@ +library_id = executors +library_name = Executors +library_description = Interface for main thread and background threads executors. +library_version = 0.1.0-alpha.1 + +osl_dependencies = core:>=0.7.0 diff --git a/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/Executors.java b/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/Executors.java new file mode 100644 index 00000000..e9b0b2f5 --- /dev/null +++ b/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/Executors.java @@ -0,0 +1,69 @@ +package net.ornithemc.osl.executors.api; + +import java.util.concurrent.CompletionException; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinWorkerThread; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class Executors { + + public static final Logger LOGGER = LogManager.getLogger("OSL|Executors"); + + private static final ExecutorService BACKGROUND_EXECUTOR = makeExecutor("Main"); + + private static ExecutorService makeExecutor(String name) { + int maxBackgroundThreads = 7; + int backgroundThreads = Math.min(Runtime.getRuntime().availableProcessors() - 1, maxBackgroundThreads); + + AtomicInteger workerCount = new AtomicInteger(1); + + return new ForkJoinPool(backgroundThreads, forkJoinPool -> { + ForkJoinWorkerThread backgroundThread = new ForkJoinWorkerThread(forkJoinPool) { + + @Override + protected void onTermination(Throwable exception) { + if (exception != null) { + LOGGER.warn("{} died", this.getName(), exception); + } else { + LOGGER.debug("{} shutdown", this.getName()); + } + + super.onTermination(exception); + } + }; + backgroundThread.setName("Worker-" + workerCount.getAndIncrement()); + return backgroundThread; + }, Executors::handleBackgroundThreadException, true); + } + + private static void handleBackgroundThreadException(Thread thread, Throwable exception) { + if (exception instanceof CompletionException) { + exception = exception.getCause(); + } + + LOGGER.error("Caught exception in thread {}", thread, exception); + } + + public static Executor backgroundExecutor() { + return BACKGROUND_EXECUTOR; + } + + public static void shutdownBackgroundExecutor() { + BACKGROUND_EXECUTOR.shutdown(); + + try { + boolean terminated = BACKGROUND_EXECUTOR.awaitTermination(3, TimeUnit.SECONDS); + + if (!terminated) { + BACKGROUND_EXECUTOR.shutdownNow(); + } + } catch (InterruptedException ignored) { + } + } +} diff --git a/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/MainThreadExecutor.java b/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/MainThreadExecutor.java new file mode 100644 index 00000000..0143dba5 --- /dev/null +++ b/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/MainThreadExecutor.java @@ -0,0 +1,12 @@ +package net.ornithemc.osl.executors.api; + +import java.util.concurrent.Executor; + +public interface MainThreadExecutor extends Executor { + + /** + * @return whether this executor is on the same thread as the caller. + */ + boolean isOnSameThread(); + +} diff --git a/settings.gradle b/settings.gradle index 01f6cf8f..ec43b638 100644 --- a/settings.gradle +++ b/settings.gradle @@ -39,6 +39,14 @@ include ':libraries:entrypoints' include ':libraries:entrypoints:entrypoints-mcin-20091223-1459-mc1.5.2' include ':libraries:entrypoints:entrypoints-mc13w16a-mc1.14.4' +include ':libraries:executors' +include ':libraries:executors:executors-mcin-20100128-2304-mcb1.9-pre2' +include ':libraries:executors:executors-mcb1.9-pre3-mc1.7.5' +include ':libraries:executors:executors-mc1.7.6-pre1-mc1.7.10' +include ':libraries:executors:executors-mc14w02a-mc14w06b' +include ':libraries:executors:executors-mc14w07a-mc14w20b' +include ':libraries:executors:executors-mc14w21a-mc1.13.2' + include ':libraries:keybinds' include ':libraries:keybinds:keybinds-mcc0.0.23a_01-mcb1.7.3' include ':libraries:keybinds:keybinds-mcb1.8-pre1-mc1.6.4' From 1392f848eec6908cd80cc76c089e7829cbb80f71 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Sat, 11 Apr 2026 13:49:42 +0200 Subject: [PATCH 2/4] [executors] separate bg exec impl from api --- .../mixin/server/MinecraftServerMixin.java | 2 +- .../impl/mixin/client/MinecraftMixin.java | 4 +-- .../mixin/server/MinecraftServerMixin.java | 2 +- .../mixin/server/MinecraftServerMixin.java | 2 +- .../impl/mixin/client/MinecraftMixin.java | 6 ++-- .../mixin/server/MinecraftServerMixin.java | 2 +- .../impl/mixin/client/MinecraftMixin.java | 2 +- .../mixin/server/MinecraftServerMixin.java | 2 +- .../osl/executors/api/BackgroundExecutor.java | 28 +++++++++++++++++++ .../executors/{api => impl}/Executors.java | 4 +-- 10 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 libraries/executors/src/main/java/net/ornithemc/osl/executors/api/BackgroundExecutor.java rename libraries/executors/src/main/java/net/ornithemc/osl/executors/{api => impl}/Executors.java (96%) diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index 1a21087e..f5fb5cdf 100644 --- a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -11,8 +11,8 @@ import net.minecraft.server.MinecraftServer; -import net.ornithemc.osl.executors.api.Executors; import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; @Mixin(MinecraftServer.class) public class MinecraftServerMixin implements MainThreadExecutor { diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index 80539e01..52d73d2e 100644 --- a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -6,14 +6,14 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; -import net.ornithemc.osl.executors.api.Executors; import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; @Mixin(Minecraft.class) public class MinecraftMixin implements MainThreadExecutor { diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index 1a21087e..f5fb5cdf 100644 --- a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -11,8 +11,8 @@ import net.minecraft.server.MinecraftServer; -import net.ornithemc.osl.executors.api.Executors; import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; @Mixin(MinecraftServer.class) public class MinecraftServerMixin implements MainThreadExecutor { diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index 1a21087e..f5fb5cdf 100644 --- a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -11,8 +11,8 @@ import net.minecraft.server.MinecraftServer; -import net.ornithemc.osl.executors.api.Executors; import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; @Mixin(MinecraftServer.class) public class MinecraftServerMixin implements MainThreadExecutor { diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index 80539e01..bd891c65 100644 --- a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -6,14 +6,14 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; -import net.ornithemc.osl.executors.api.Executors; import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; @Mixin(Minecraft.class) public class MinecraftMixin implements MainThreadExecutor { @@ -25,7 +25,7 @@ public class MinecraftMixin implements MainThreadExecutor { private Thread thread; @Inject( - method = "run", + method = "init", at = @At( value = "HEAD" ) diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index 1a21087e..f5fb5cdf 100644 --- a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -11,8 +11,8 @@ import net.minecraft.server.MinecraftServer; -import net.ornithemc.osl.executors.api.Executors; import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; @Mixin(MinecraftServer.class) public class MinecraftServerMixin implements MainThreadExecutor { diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index fa14b7a8..7613e48f 100644 --- a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -12,8 +12,8 @@ import net.minecraft.client.Minecraft; -import net.ornithemc.osl.executors.api.Executors; import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; @Mixin(Minecraft.class) public class MinecraftMixin implements MainThreadExecutor { diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index 1a21087e..f5fb5cdf 100644 --- a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -11,8 +11,8 @@ import net.minecraft.server.MinecraftServer; -import net.ornithemc.osl.executors.api.Executors; import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; @Mixin(MinecraftServer.class) public class MinecraftServerMixin implements MainThreadExecutor { diff --git a/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/BackgroundExecutor.java b/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/BackgroundExecutor.java new file mode 100644 index 00000000..50190faa --- /dev/null +++ b/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/BackgroundExecutor.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.executors.api; + +import java.util.concurrent.Executor; + +import net.ornithemc.osl.executors.impl.Executors; + +/** + * A utility class for accessing the background executor. + * + *

+ * The background executor can be used to run tasks asynchronously. + * This will take load off the game's main thread, which can prevent + * excessive slow-downs. + * + *

+ * Do note that operations done on background threads must be thread- + * safe. Do NOT modify the world or render state in background tasks, + * as this will inevitably lead to save corruption and crashes. + */ +public final class BackgroundExecutor { + + /** + * @return the background executor. + */ + public static Executor get() { + return Executors.backgroundExecutor(); + } +} diff --git a/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/Executors.java b/libraries/executors/src/main/java/net/ornithemc/osl/executors/impl/Executors.java similarity index 96% rename from libraries/executors/src/main/java/net/ornithemc/osl/executors/api/Executors.java rename to libraries/executors/src/main/java/net/ornithemc/osl/executors/impl/Executors.java index e9b0b2f5..3a6b9275 100644 --- a/libraries/executors/src/main/java/net/ornithemc/osl/executors/api/Executors.java +++ b/libraries/executors/src/main/java/net/ornithemc/osl/executors/impl/Executors.java @@ -1,4 +1,4 @@ -package net.ornithemc.osl.executors.api; +package net.ornithemc.osl.executors.impl; import java.util.concurrent.CompletionException; import java.util.concurrent.Executor; @@ -11,7 +11,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -public class Executors { +public final class Executors { public static final Logger LOGGER = LogManager.getLogger("OSL|Executors"); From aad1047da03604306d83d6445cb5e186dd134073 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Sat, 11 Apr 2026 18:55:36 +0200 Subject: [PATCH 3/4] [executors] shutdown background executor on game shutdown --- .../impl/mixin/client/MinecraftMixin.java | 15 +++++++++++++++ .../impl/mixin/server/MinecraftServerMixin.java | 10 ++++++++++ .../impl/mixin/client/MinecraftMixin.java | 10 ++++++++++ .../impl/mixin/server/MinecraftServerMixin.java | 10 ++++++++++ .../impl/mixin/client/MinecraftMixin.java | 15 +++++++++++++++ .../impl/mixin/server/MinecraftServerMixin.java | 10 ++++++++++ .../impl/mixin/client/MinecraftMixin.java | 15 +++++++++++++++ .../impl/mixin/server/MinecraftServerMixin.java | 15 +++++++++++++++ .../impl/mixin/client/MinecraftMixin.java | 10 ++++++++++ .../impl/mixin/server/MinecraftServerMixin.java | 10 ++++++++++ .../impl/mixin/client/MinecraftMixin.java | 10 ++++++++++ .../impl/mixin/server/MinecraftServerMixin.java | 10 ++++++++++ 12 files changed, 140 insertions(+) diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index fa705b78..10e766ed 100644 --- a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -4,11 +4,16 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.google.common.util.concurrent.ListenableFuture; import net.minecraft.client.Minecraft; +import net.ornithemc.osl.executors.impl.Executors; + @Mixin(Minecraft.class) public class MinecraftMixin implements Executor { @@ -19,4 +24,14 @@ public class MinecraftMixin implements Executor { public void execute(Runnable command) { this.executeTask(command); } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index f5fb5cdf..a460a83d 100644 --- a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -76,4 +76,14 @@ private void runTask(Runnable task) { Executors.LOGGER.fatal("Error running task", t); } } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index 52d73d2e..5adc4b8e 100644 --- a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -79,4 +79,14 @@ private void runTask(Runnable task) { Executors.LOGGER.fatal("Error running task", t); } } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index f5fb5cdf..a460a83d 100644 --- a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -76,4 +76,14 @@ private void runTask(Runnable task) { Executors.LOGGER.fatal("Error running task", t); } } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index fa705b78..10e766ed 100644 --- a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -4,11 +4,16 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.google.common.util.concurrent.ListenableFuture; import net.minecraft.client.Minecraft; +import net.ornithemc.osl.executors.impl.Executors; + @Mixin(Minecraft.class) public class MinecraftMixin implements Executor { @@ -19,4 +24,14 @@ public class MinecraftMixin implements Executor { public void execute(Runnable command) { this.executeTask(command); } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index f5fb5cdf..a460a83d 100644 --- a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -76,4 +76,14 @@ private void runTask(Runnable task) { Executors.LOGGER.fatal("Error running task", t); } } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index 2a6c1e72..f25fed9e 100644 --- a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -3,10 +3,15 @@ import java.util.concurrent.Executor; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; import net.minecraft.util.BlockableEventLoop; +import net.ornithemc.osl.executors.impl.Executors; + @Mixin(Minecraft.class) public class MinecraftMixin implements Executor { @@ -14,4 +19,14 @@ public class MinecraftMixin implements Executor { public void execute(Runnable command) { ((BlockableEventLoop) this).executeTask(command); } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index 1ca9840e..c1d62074 100644 --- a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -3,10 +3,15 @@ import java.util.concurrent.Executor; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.server.MinecraftServer; import net.minecraft.util.BlockableEventLoop; +import net.ornithemc.osl.executors.impl.Executors; + @Mixin(MinecraftServer.class) public class MinecraftServerMixin implements Executor { @@ -14,4 +19,14 @@ public class MinecraftServerMixin implements Executor { public void execute(Runnable command) { ((BlockableEventLoop) this).executeTask(command); } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index bd891c65..96ef6678 100644 --- a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -79,4 +79,14 @@ private void runTask(Runnable task) { Executors.LOGGER.fatal("Error running task", t); } } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index f5fb5cdf..a460a83d 100644 --- a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -76,4 +76,14 @@ private void runTask(Runnable task) { Executors.LOGGER.fatal("Error running task", t); } } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index 7613e48f..cb3d0076 100644 --- a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -79,4 +79,14 @@ private void runTask(Runnable task) { Executors.LOGGER.fatal("Error running task", t); } } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index f5fb5cdf..a460a83d 100644 --- a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -76,4 +76,14 @@ private void runTask(Runnable task) { Executors.LOGGER.fatal("Error running task", t); } } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } } From 3b0b3c9761862a371789c48fcc3a91db86108c36 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Sat, 11 Apr 2026 19:13:17 +0200 Subject: [PATCH 4/4] [executors] fix singleplayer --- .../mixin/common/MinecraftServerMixin.java | 87 ++++++++++++++++++ .../mixin/server/MinecraftServerMixin.java | 67 +------------- .../main/resources/osl.executors.mixins.json | 1 + .../build.gradle | 0 .../gradle.properties | 6 ++ .../impl/mixin/client/MinecraftMixin.java | 0 .../mixin/common/MinecraftServerMixin.java | 85 +++++++++++++++++ .../mixin/server/MinecraftServerMixin.java | 24 +++++ .../src/main/resources/fabric.mod.json | 4 +- .../main/resources/osl.executors.classtweaker | 0 .../main/resources/osl.executors.mixins.json | 18 ++++ .../impl/mixin/client/MinecraftMixin.java | 8 ++ .../mixin/common/MinecraftServerMixin.java | 87 ++++++++++++++++++ .../mixin/server/MinecraftServerMixin.java | 67 +------------- .../main/resources/osl.executors.mixins.json | 1 + .../mixin/common/MinecraftServerMixin.java | 87 ++++++++++++++++++ .../mixin/server/MinecraftServerMixin.java | 67 +------------- .../main/resources/osl.executors.mixins.json | 1 + .../mixin/common/MinecraftServerMixin.java | 17 ++++ .../mixin/server/MinecraftServerMixin.java | 10 +- .../main/resources/osl.executors.mixins.json | 1 + .../gradle.properties | 6 -- .../build.gradle | 1 + .../gradle.properties | 7 ++ .../impl/mixin/client/MinecraftMixin.java | 92 +++++++++++++++++++ .../mixin/server/MinecraftServerMixin.java | 8 +- .../src/main/resources/fabric.mod.json | 26 ++++++ .../main/resources/osl.executors.classtweaker | 4 + .../main/resources/osl.executors.mixins.json | 0 .../mixin/server/MinecraftServerMixin.java | 8 +- settings.gradle | 3 +- 31 files changed, 575 insertions(+), 218 deletions(-) create mode 100644 libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java rename libraries/executors/{executors-mcb1.9-pre3-mc1.7.5 => executors-mc12w18a-mc1.7.5}/build.gradle (100%) create mode 100644 libraries/executors/executors-mc12w18a-mc1.7.5/gradle.properties rename libraries/executors/{executors-mcb1.9-pre3-mc1.7.5 => executors-mc12w18a-mc1.7.5}/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java (100%) create mode 100644 libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java create mode 100644 libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java rename libraries/executors/{executors-mcb1.9-pre3-mc1.7.5 => executors-mc12w18a-mc1.7.5}/src/main/resources/fabric.mod.json (84%) rename libraries/executors/{executors-mcb1.9-pre3-mc1.7.5 => executors-mc12w18a-mc1.7.5}/src/main/resources/osl.executors.classtweaker (100%) create mode 100644 libraries/executors/executors-mc12w18a-mc1.7.5/src/main/resources/osl.executors.mixins.json create mode 100644 libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java create mode 100644 libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java create mode 100644 libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java delete mode 100644 libraries/executors/executors-mcb1.9-pre3-mc1.7.5/gradle.properties create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc12w17a/build.gradle create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc12w17a/gradle.properties create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java rename libraries/executors/{executors-mcb1.9-pre3-mc1.7.5 => executors-mcb1.9-pre3-mc12w17a}/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java (89%) create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/fabric.mod.json create mode 100644 libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/osl.executors.classtweaker rename libraries/executors/{executors-mcb1.9-pre3-mc1.7.5 => executors-mcb1.9-pre3-mc12w17a}/src/main/resources/osl.executors.mixins.json (100%) diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 00000000..367e37fb --- /dev/null +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,87 @@ +package net.ornithemc.osl.executors.impl.mixin.common; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.profiler.Profiler; + +import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor { + + @Shadow @Final + private Profiler profiler; + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "tickWorlds", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.profiler.push("scheduledExecutables"); + this.runPendingTasks(); + this.profiler.pop(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index a460a83d..bc602418 100644 --- a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -1,81 +1,16 @@ package net.ornithemc.osl.executors.impl.mixin.server; -import java.util.ArrayDeque; -import java.util.Queue; - import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.server.MinecraftServer; -import net.ornithemc.osl.executors.api.MainThreadExecutor; import net.ornithemc.osl.executors.impl.Executors; @Mixin(MinecraftServer.class) -public class MinecraftServerMixin implements MainThreadExecutor { - - @Unique - private final Queue pendingTasks = new ArrayDeque<>(); - - @Unique - private Thread thread; - - @Inject( - method = "run", - at = @At( - value = "HEAD" - ) - ) - private void osl$executors$setThread(CallbackInfo ci) { - this.thread = Thread.currentThread(); - } - - @Override - public void execute(Runnable command) { - if (this.isOnSameThread()) { - command.run(); - } else { - synchronized (this.pendingTasks) { - this.pendingTasks.add(command); - } - } - } - - @Override - public boolean isOnSameThread() { - return Thread.currentThread() == this.thread; - } - - @Inject( - method = "tick", - at = @At( - value = "HEAD" - ) - ) - private void osl$executors$runPendingTasks(CallbackInfo ci) { - this.runPendingTasks(); - } - - @Unique - private void runPendingTasks() { - synchronized (this.pendingTasks) { - while (!this.pendingTasks.isEmpty()) { - this.runTask(this.pendingTasks.poll()); - } - } - } - - @Unique - private void runTask(Runnable task) { - try { - task.run(); - } catch (Throwable t) { - Executors.LOGGER.fatal("Error running task", t); - } - } +public class MinecraftServerMixin { @Inject( method = "shutdown", diff --git a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.mixins.json index 8b64f37d..40105b6d 100644 --- a/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.mixins.json +++ b/libraries/executors/executors-mc1.7.6-pre1-mc1.7.10/src/main/resources/osl.executors.mixins.json @@ -4,6 +4,7 @@ "package": "net.ornithemc.osl.executors.impl.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "common.MinecraftServerMixin" ], "client": [ "client.MinecraftMixin" diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/build.gradle b/libraries/executors/executors-mc12w18a-mc1.7.5/build.gradle similarity index 100% rename from libraries/executors/executors-mcb1.9-pre3-mc1.7.5/build.gradle rename to libraries/executors/executors-mc12w18a-mc1.7.5/build.gradle diff --git a/libraries/executors/executors-mc12w18a-mc1.7.5/gradle.properties b/libraries/executors/executors-mc12w18a-mc1.7.5/gradle.properties new file mode 100644 index 00000000..b032be5a --- /dev/null +++ b/libraries/executors/executors-mc12w18a-mc1.7.5/gradle.properties @@ -0,0 +1,6 @@ +min_mc_version = 12w18a +max_mc_version = 1.7.5 +minecraft_dependency = >=1.3-alpha.12.18.a <=1.7.5 + +minecraft_version = 1.7.5 +nests_build = 5 diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java similarity index 100% rename from libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java rename to libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java diff --git a/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 00000000..00d33439 --- /dev/null +++ b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,85 @@ +package net.ornithemc.osl.executors.impl.mixin.common; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.objectweb.asm.Opcodes; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; + +import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "tick", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/server/MinecraftServer;ticks:I", + opcode = Opcodes.PUTFIELD, + shift = Shift.AFTER + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..bc602418 --- /dev/null +++ b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,24 @@ +package net.ornithemc.osl.executors.impl.mixin.server; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; + +import net.ornithemc.osl.executors.impl.Executors; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } +} diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/fabric.mod.json b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/resources/fabric.mod.json similarity index 84% rename from libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/fabric.mod.json rename to libraries/executors/executors-mc12w18a-mc1.7.5/src/main/resources/fabric.mod.json index f27d3e71..a894b2e9 100644 --- a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/fabric.mod.json +++ b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "osl-executors", - "version": "0.1.0-alpha.1+mcb1.9-pre3-1350-mc1.7.5", + "version": "0.1.0-alpha.1+mc12w18a-mc1.7.5", "environment": "*", "mixins": [ "osl.executors.mixins.json" @@ -9,7 +9,7 @@ "accessWidener": "osl.executors.classtweaker", "depends": { "fabricloader": "\u003e\u003d0.17.3", - "minecraft": "\u003e\u003d1.0.0-beta.9.0.3 \u003c\u003d1.7.5", + "minecraft": "\u003e\u003d1.3-alpha.12.18.a \u003c\u003d1.7.5", "osl-core": "\u003e\u003d0.7.0" }, "name": "OSL Executors", diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.classtweaker b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/resources/osl.executors.classtweaker similarity index 100% rename from libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.classtweaker rename to libraries/executors/executors-mc12w18a-mc1.7.5/src/main/resources/osl.executors.classtweaker diff --git a/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/resources/osl.executors.mixins.json new file mode 100644 index 00000000..40105b6d --- /dev/null +++ b/libraries/executors/executors-mc12w18a-mc1.7.5/src/main/resources/osl.executors.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.executors.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.MinecraftServerMixin" + ], + "client": [ + "client.MinecraftMixin" + ], + "server": [ + "server.MinecraftServerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java index 5adc4b8e..8e4138a2 100644 --- a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -3,7 +3,9 @@ import java.util.ArrayDeque; import java.util.Queue; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At.Shift; @@ -11,6 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; +import net.minecraft.util.profiler.Profiler; import net.ornithemc.osl.executors.api.MainThreadExecutor; import net.ornithemc.osl.executors.impl.Executors; @@ -18,6 +21,9 @@ @Mixin(Minecraft.class) public class MinecraftMixin implements MainThreadExecutor { + @Shadow @Final + private Profiler profiler; + @Unique private final Queue pendingTasks = new ArrayDeque<>(); @@ -59,7 +65,9 @@ public boolean isOnSameThread() { ) ) private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.profiler.push("scheduledExecutables"); this.runPendingTasks(); + this.profiler.pop(); } @Unique diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 00000000..367e37fb --- /dev/null +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,87 @@ +package net.ornithemc.osl.executors.impl.mixin.common; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.profiler.Profiler; + +import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor { + + @Shadow @Final + private Profiler profiler; + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "tickWorlds", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.profiler.push("scheduledExecutables"); + this.runPendingTasks(); + this.profiler.pop(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index a460a83d..bc602418 100644 --- a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -1,81 +1,16 @@ package net.ornithemc.osl.executors.impl.mixin.server; -import java.util.ArrayDeque; -import java.util.Queue; - import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.server.MinecraftServer; -import net.ornithemc.osl.executors.api.MainThreadExecutor; import net.ornithemc.osl.executors.impl.Executors; @Mixin(MinecraftServer.class) -public class MinecraftServerMixin implements MainThreadExecutor { - - @Unique - private final Queue pendingTasks = new ArrayDeque<>(); - - @Unique - private Thread thread; - - @Inject( - method = "run", - at = @At( - value = "HEAD" - ) - ) - private void osl$executors$setThread(CallbackInfo ci) { - this.thread = Thread.currentThread(); - } - - @Override - public void execute(Runnable command) { - if (this.isOnSameThread()) { - command.run(); - } else { - synchronized (this.pendingTasks) { - this.pendingTasks.add(command); - } - } - } - - @Override - public boolean isOnSameThread() { - return Thread.currentThread() == this.thread; - } - - @Inject( - method = "tick", - at = @At( - value = "HEAD" - ) - ) - private void osl$executors$runPendingTasks(CallbackInfo ci) { - this.runPendingTasks(); - } - - @Unique - private void runPendingTasks() { - synchronized (this.pendingTasks) { - while (!this.pendingTasks.isEmpty()) { - this.runTask(this.pendingTasks.poll()); - } - } - } - - @Unique - private void runTask(Runnable task) { - try { - task.run(); - } catch (Throwable t) { - Executors.LOGGER.fatal("Error running task", t); - } - } +public class MinecraftServerMixin { @Inject( method = "shutdown", diff --git a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.mixins.json index 8b64f37d..40105b6d 100644 --- a/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.mixins.json +++ b/libraries/executors/executors-mc14w02a-mc14w06b/src/main/resources/osl.executors.mixins.json @@ -4,6 +4,7 @@ "package": "net.ornithemc.osl.executors.impl.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "common.MinecraftServerMixin" ], "client": [ "client.MinecraftMixin" diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 00000000..367e37fb --- /dev/null +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,87 @@ +package net.ornithemc.osl.executors.impl.mixin.common; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.profiler.Profiler; + +import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor { + + @Shadow @Final + private Profiler profiler; + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "run", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "tickWorlds", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.profiler.push("scheduledExecutables"); + this.runPendingTasks(); + this.profiler.pop(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } +} diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index a460a83d..bc602418 100644 --- a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -1,81 +1,16 @@ package net.ornithemc.osl.executors.impl.mixin.server; -import java.util.ArrayDeque; -import java.util.Queue; - import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.server.MinecraftServer; -import net.ornithemc.osl.executors.api.MainThreadExecutor; import net.ornithemc.osl.executors.impl.Executors; @Mixin(MinecraftServer.class) -public class MinecraftServerMixin implements MainThreadExecutor { - - @Unique - private final Queue pendingTasks = new ArrayDeque<>(); - - @Unique - private Thread thread; - - @Inject( - method = "run", - at = @At( - value = "HEAD" - ) - ) - private void osl$executors$setThread(CallbackInfo ci) { - this.thread = Thread.currentThread(); - } - - @Override - public void execute(Runnable command) { - if (this.isOnSameThread()) { - command.run(); - } else { - synchronized (this.pendingTasks) { - this.pendingTasks.add(command); - } - } - } - - @Override - public boolean isOnSameThread() { - return Thread.currentThread() == this.thread; - } - - @Inject( - method = "tick", - at = @At( - value = "HEAD" - ) - ) - private void osl$executors$runPendingTasks(CallbackInfo ci) { - this.runPendingTasks(); - } - - @Unique - private void runPendingTasks() { - synchronized (this.pendingTasks) { - while (!this.pendingTasks.isEmpty()) { - this.runTask(this.pendingTasks.poll()); - } - } - } - - @Unique - private void runTask(Runnable task) { - try { - task.run(); - } catch (Throwable t) { - Executors.LOGGER.fatal("Error running task", t); - } - } +public class MinecraftServerMixin { @Inject( method = "shutdown", diff --git a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.mixins.json index 8b64f37d..40105b6d 100644 --- a/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.mixins.json +++ b/libraries/executors/executors-mc14w07a-mc14w20b/src/main/resources/osl.executors.mixins.json @@ -4,6 +4,7 @@ "package": "net.ornithemc.osl.executors.impl.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "common.MinecraftServerMixin" ], "client": [ "client.MinecraftMixin" diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 00000000..54c32ee6 --- /dev/null +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.executors.impl.mixin.common; + +import java.util.concurrent.Executor; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.BlockableEventLoop; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements Executor { + + @Override + public void execute(Runnable command) { + ((BlockableEventLoop) this).executeTask(command); + } +} diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index c1d62074..bc602418 100644 --- a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -1,24 +1,16 @@ package net.ornithemc.osl.executors.impl.mixin.server; -import java.util.concurrent.Executor; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.BlockableEventLoop; import net.ornithemc.osl.executors.impl.Executors; @Mixin(MinecraftServer.class) -public class MinecraftServerMixin implements Executor { - - @Override - public void execute(Runnable command) { - ((BlockableEventLoop) this).executeTask(command); - } +public class MinecraftServerMixin { @Inject( method = "shutdown", diff --git a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.mixins.json index 8b64f37d..40105b6d 100644 --- a/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.mixins.json +++ b/libraries/executors/executors-mc14w21a-mc1.13.2/src/main/resources/osl.executors.mixins.json @@ -4,6 +4,7 @@ "package": "net.ornithemc.osl.executors.impl.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "common.MinecraftServerMixin" ], "client": [ "client.MinecraftMixin" diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/gradle.properties b/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/gradle.properties deleted file mode 100644 index d06d12cf..00000000 --- a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -min_mc_version = b1.9-pre3-1350 -max_mc_version = 1.7.5 -minecraft_dependency = >=1.0.0-beta.9.0.3 <=1.7.5 - -minecraft_version = 1.7.5 -nests_build = 5 diff --git a/libraries/executors/executors-mcb1.9-pre3-mc12w17a/build.gradle b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/build.gradle new file mode 100644 index 00000000..0a350fdb --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/executors/executors-mcb1.9-pre3-mc12w17a/gradle.properties b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/gradle.properties new file mode 100644 index 00000000..25342b20 --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/gradle.properties @@ -0,0 +1,7 @@ +min_mc_version = b1.9-pre3-1350 +max_mc_version = 12w17a +minecraft_dependency = >=1.0.0-beta.9.0.3 <=1.3-alpha.12.17.a + +minecraft_version = 12w17a +client_nests_build = 10 +server_nests_build = 5 diff --git a/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..96ef6678 --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/java/net/ornithemc/osl/executors/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,92 @@ +package net.ornithemc.osl.executors.impl.mixin.client; + +import java.util.ArrayDeque; +import java.util.Queue; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; + +import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.executors.impl.Executors; + +@Mixin(Minecraft.class) +public class MinecraftMixin implements MainThreadExecutor { + + @Unique + private final Queue pendingTasks = new ArrayDeque<>(); + + @Unique + private Thread thread; + + @Inject( + method = "init", + at = @At( + value = "HEAD" + ) + ) + private void osl$executors$setThread(CallbackInfo ci) { + this.thread = Thread.currentThread(); + } + + @Override + public void execute(Runnable command) { + if (this.isOnSameThread()) { + command.run(); + } else { + synchronized (this.pendingTasks) { + this.pendingTasks.add(command); + } + } + } + + @Override + public boolean isOnSameThread() { + return Thread.currentThread() == this.thread; + } + + @Inject( + method = "runGame", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/TickTimer;advance()V", + shift = Shift.AFTER + ) + ) + private void osl$executors$runPendingTasks(CallbackInfo ci) { + this.runPendingTasks(); + } + + @Unique + private void runPendingTasks() { + synchronized (this.pendingTasks) { + while (!this.pendingTasks.isEmpty()) { + this.runTask(this.pendingTasks.poll()); + } + } + } + + @Unique + private void runTask(Runnable task) { + try { + task.run(); + } catch (Throwable t) { + Executors.LOGGER.fatal("Error running task", t); + } + } + + @Inject( + method = "shutdown", + at = @At( + value = "TAIL" + ) + ) + private void osl$executors$shutdownBackgroundExecutor(CallbackInfo ci) { + Executors.shutdownBackgroundExecutor(); + } +} diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java similarity index 89% rename from libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java rename to libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index a460a83d..8c2556b6 100644 --- a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -3,9 +3,12 @@ import java.util.ArrayDeque; import java.util.Queue; +import org.objectweb.asm.Opcodes; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -52,7 +55,10 @@ public boolean isOnSameThread() { @Inject( method = "tick", at = @At( - value = "HEAD" + value = "FIELD", + target = "Lnet/minecraft/server/MinecraftServer;ticks:I", + opcode = Opcodes.PUTFIELD, + shift = Shift.AFTER ) ) private void osl$executors$runPendingTasks(CallbackInfo ci) { diff --git a/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/fabric.mod.json b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..905e0934 --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "osl-executors", + "version": "0.1.0-alpha.1+mcb1.9-pre3-1350-mc12w17a", + "environment": "*", + "mixins": [ + "osl.executors.mixins.json" + ], + "accessWidener": "osl.executors.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.17.3", + "minecraft": "\u003e\u003d1.0.0-beta.9.0.3 \u003c\u003d1.3-alpha.12.17.a", + "osl-core": "\u003e\u003d0.7.0" + }, + "name": "OSL Executors", + "description": "Interface for main thread and background threads executors.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/osl.executors.classtweaker b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/osl.executors.classtweaker new file mode 100644 index 00000000..a8205231 --- /dev/null +++ b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/osl.executors.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/client/Minecraft net/ornithemc/osl/executors/api/MainThreadExecutor +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/executors/api/MainThreadExecutor \ No newline at end of file diff --git a/libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.mixins.json b/libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/osl.executors.mixins.json similarity index 100% rename from libraries/executors/executors-mcb1.9-pre3-mc1.7.5/src/main/resources/osl.executors.mixins.json rename to libraries/executors/executors-mcb1.9-pre3-mc12w17a/src/main/resources/osl.executors.mixins.json diff --git a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java index a460a83d..8c2556b6 100644 --- a/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java +++ b/libraries/executors/executors-mcin-20100128-2304-mcb1.9-pre2/src/main/java/net/ornithemc/osl/executors/impl/mixin/server/MinecraftServerMixin.java @@ -3,9 +3,12 @@ import java.util.ArrayDeque; import java.util.Queue; +import org.objectweb.asm.Opcodes; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -52,7 +55,10 @@ public boolean isOnSameThread() { @Inject( method = "tick", at = @At( - value = "HEAD" + value = "FIELD", + target = "Lnet/minecraft/server/MinecraftServer;ticks:I", + opcode = Opcodes.PUTFIELD, + shift = Shift.AFTER ) ) private void osl$executors$runPendingTasks(CallbackInfo ci) { diff --git a/settings.gradle b/settings.gradle index ec43b638..e0a07c50 100644 --- a/settings.gradle +++ b/settings.gradle @@ -41,7 +41,8 @@ include ':libraries:entrypoints:entrypoints-mc13w16a-mc1.14.4' include ':libraries:executors' include ':libraries:executors:executors-mcin-20100128-2304-mcb1.9-pre2' -include ':libraries:executors:executors-mcb1.9-pre3-mc1.7.5' +include ':libraries:executors:executors-mcb1.9-pre3-mc12w17a' +include ':libraries:executors:executors-mc12w18a-mc1.7.5' include ':libraries:executors:executors-mc1.7.6-pre1-mc1.7.10' include ':libraries:executors:executors-mc14w02a-mc14w06b' include ':libraries:executors:executors-mc14w07a-mc14w20b'