Skip to content

Commit d74deb6

Browse files
committed
[executors] implement main thread executors in 1.13.2-
1 parent 5122c88 commit d74deb6

File tree

48 files changed

+1150
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1150
-0
lines changed

libraries/executors/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Executors API
2+
3+
The Executors API provides an interface for main thread and background thread executors.

libraries/executors/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
setUpLibrary(project)
2+
3+
dependencies {
4+
implementation 'com.google.code.gson:gson:2.8.0'
5+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
setUpModule(project)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
min_mc_version = 1.7.6-pre1
2+
max_mc_version = 1.7.10
3+
minecraft_dependency = >=1.7.6-rc.1 <=1.7.10
4+
5+
minecraft_version = 1.7.10
6+
nests_build = 6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package net.ornithemc.osl.executors.impl.mixin.client;
2+
3+
import java.util.concurrent.Executor;
4+
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.Shadow;
7+
8+
import com.google.common.util.concurrent.ListenableFuture;
9+
10+
import net.minecraft.client.Minecraft;
11+
12+
@Mixin(Minecraft.class)
13+
public class MinecraftMixin implements Executor {
14+
15+
@Shadow
16+
private ListenableFuture<?> executeTask(Runnable task) { return null; }
17+
18+
@Override
19+
public void execute(Runnable command) {
20+
this.executeTask(command);
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package net.ornithemc.osl.executors.impl.mixin.server;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.Queue;
5+
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Unique;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11+
12+
import net.minecraft.server.MinecraftServer;
13+
14+
import net.ornithemc.osl.executors.api.Executors;
15+
import net.ornithemc.osl.executors.api.MainThreadExecutor;
16+
17+
@Mixin(MinecraftServer.class)
18+
public class MinecraftServerMixin implements MainThreadExecutor {
19+
20+
@Unique
21+
private final Queue<Runnable> pendingTasks = new ArrayDeque<>();
22+
23+
@Unique
24+
private Thread thread;
25+
26+
@Inject(
27+
method = "run",
28+
at = @At(
29+
value = "HEAD"
30+
)
31+
)
32+
private void osl$executors$setThread(CallbackInfo ci) {
33+
this.thread = Thread.currentThread();
34+
}
35+
36+
@Override
37+
public void execute(Runnable command) {
38+
if (this.isOnSameThread()) {
39+
command.run();
40+
} else {
41+
synchronized (this.pendingTasks) {
42+
this.pendingTasks.add(command);
43+
}
44+
}
45+
}
46+
47+
@Override
48+
public boolean isOnSameThread() {
49+
return Thread.currentThread() == this.thread;
50+
}
51+
52+
@Inject(
53+
method = "tick",
54+
at = @At(
55+
value = "HEAD"
56+
)
57+
)
58+
private void osl$executors$runPendingTasks(CallbackInfo ci) {
59+
this.runPendingTasks();
60+
}
61+
62+
@Unique
63+
private void runPendingTasks() {
64+
synchronized (this.pendingTasks) {
65+
while (!this.pendingTasks.isEmpty()) {
66+
this.runTask(this.pendingTasks.poll());
67+
}
68+
}
69+
}
70+
71+
@Unique
72+
private void runTask(Runnable task) {
73+
try {
74+
task.run();
75+
} catch (Throwable t) {
76+
Executors.LOGGER.fatal("Error running task", t);
77+
}
78+
}
79+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"schemaVersion": 1,
3+
"id": "osl-executors",
4+
"version": "0.1.0-alpha.1+mc1.7.6-pre1-mc1.7.10",
5+
"environment": "*",
6+
"mixins": [
7+
"osl.executors.mixins.json"
8+
],
9+
"accessWidener": "osl.executors.classtweaker",
10+
"depends": {
11+
"fabricloader": "\u003e\u003d0.17.3",
12+
"minecraft": "\u003e\u003d1.7.6-rc.1 \u003c\u003d1.7.10",
13+
"osl-core": "\u003e\u003d0.7.0"
14+
},
15+
"name": "OSL Executors",
16+
"description": "Interface for main thread and background threads executors.",
17+
"authors": [
18+
"OrnitheMC"
19+
],
20+
"contact": {
21+
"homepage": "https://ornithemc.net/",
22+
"issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues",
23+
"sources": "https://github.com/OrnitheMC/ornithe-standard-libraries"
24+
},
25+
"license": "Apache-2.0"
26+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
classTweaker v1 named
2+
3+
transitive-inject-interface net/minecraft/client/Minecraft java/util/concurrent/Executor
4+
transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/executors/api/MainThreadExecutor
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"required": true,
3+
"minVersion": "0.8",
4+
"package": "net.ornithemc.osl.executors.impl.mixin",
5+
"compatibilityLevel": "JAVA_8",
6+
"mixins": [
7+
],
8+
"client": [
9+
"client.MinecraftMixin"
10+
],
11+
"server": [
12+
"server.MinecraftServerMixin"
13+
],
14+
"injectors": {
15+
"defaultRequire": 1
16+
}
17+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
setUpModule(project)

0 commit comments

Comments
 (0)