Skip to content

Commit 17b162b

Browse files
committed
Fix main thread being blocked when initially enabling the battery feature
Signed-off-by: Lilly Rose Berner <lilly@lostluma.net>
1 parent c1a1756 commit 17b162b

File tree

4 files changed

+48
-13
lines changed

4 files changed

+48
-13
lines changed

platforms/common/src/main/java/dynamic_fps/impl/DynamicFPSMod.java

+15-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import dynamic_fps.impl.util.Logging;
1616
import dynamic_fps.impl.feature.state.OptionHolder;
1717
import dynamic_fps.impl.util.ResourceLocations;
18+
import dynamic_fps.impl.util.Threads;
1819
import dynamic_fps.impl.util.Version;
1920
import dynamic_fps.impl.feature.volume.SmoothVolumeHandler;
2021
import dynamic_fps.impl.util.duck.DuckLoadingOverlay;
@@ -198,11 +199,20 @@ public static void onBatteryStatusChanged(State before, State after) {
198199
// Internal logic
199200

200201
private static void doInit() {
201-
// NOTE: Init battery tracker first here
202-
// Since the idle handler queries it for info
203-
BatteryTracker.init();
204-
IdleHandler.init();
205202
SmoothVolumeHandler.init();
203+
204+
if (!BatteryTracker.isFeatureEnabled()) {
205+
IdleHandler.init();
206+
} else {
207+
// Run battery tracker init on its own thread to ensure
208+
// The initial library download doesn't block rendering
209+
Threads.create("init", () -> {
210+
BatteryTracker.init();
211+
// The idle handler must be initialized later,
212+
// Since it queries whether there are batteries available
213+
Threads.runOnMainThread(IdleHandler::init);
214+
});
215+
}
206216
}
207217

208218
private static void showNotification(String titleTranslationKey, String iconPath) {
@@ -263,7 +273,7 @@ private static void checkForStateChanges() {
263273
checkForStateChanges0();
264274
} else {
265275
// Schedule check for the beginning of the next frame
266-
minecraft.schedule(DynamicFPSMod::checkForStateChanges0);
276+
Threads.runOnMainThread(DynamicFPSMod::checkForStateChanges0);
267277
}
268278
}
269279

platforms/common/src/main/java/dynamic_fps/impl/compat/GLFW.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dynamic_fps.impl.compat;
22

33
import dynamic_fps.impl.DynamicFPSMod;
4+
import dynamic_fps.impl.util.Threads;
45
import dynamic_fps.impl.util.Version;
56
import net.minecraft.client.Minecraft;
67

@@ -32,7 +33,7 @@ public static void applyWorkaround() {
3233
// Agrees that the window is focused. The mod is
3334
// A little too fast for this, so we schedule it
3435
// For the next client tick (before next frame).
35-
minecraft.schedule(minecraft.mouseHandler::grabMouse);
36+
Threads.runOnMainThread(minecraft.mouseHandler::grabMouse);
3637
}
3738
}
3839

platforms/common/src/main/java/dynamic_fps/impl/feature/battery/BatteryTracker.java

+10-7
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
import dynamic_fps.impl.config.DynamicFPSConfig;
55
import dynamic_fps.impl.service.Platform;
66
import dynamic_fps.impl.util.Logging;
7+
import dynamic_fps.impl.util.Threads;
78
import net.lostluma.battery.api.Battery;
89
import net.lostluma.battery.api.Manager;
910
import net.lostluma.battery.api.State;
1011
import net.lostluma.battery.api.exception.LibraryLoadError;
1112
import net.lostluma.battery.api.util.LibraryUtil;
12-
import net.minecraft.client.Minecraft;
1313
import org.jetbrains.annotations.Nullable;
1414

1515
import java.io.IOException;
@@ -29,7 +29,6 @@ public class BatteryTracker {
2929
private static @Nullable Manager manager = null;
3030
private static Collection<Battery> batteries = Collections.emptyList();
3131

32-
private static final Minecraft minecraft = Minecraft.getInstance();
3332
private static final Duration updateInterval = Duration.of(15, ChronoUnit.SECONDS);
3433

3534
public static int charge() {
@@ -57,7 +56,7 @@ public static boolean hasBatteries() {
5756
}
5857

5958
public static void init() {
60-
if (manager != null || !DynamicFPSConfig.INSTANCE.batteryTracker().enabled()) {
59+
if (manager != null || !isFeatureEnabled()) {
6160
return;
6261
}
6362

@@ -72,10 +71,14 @@ public static void init() {
7271
}
7372
} else {
7473
manager = temp; // Keep around to allow updating batteries
75-
Thread.ofVirtual().name("refresh-battery").start(BatteryTracker::updateBatteries);
74+
Threads.create("refresh-battery", BatteryTracker::updateBatteries);
7675
}
7776
}
7877

78+
public static boolean isFeatureEnabled() {
79+
return DynamicFPSConfig.INSTANCE.batteryTracker().enabled();
80+
}
81+
7982
private static State mergeStates(State a, State b) {
8083
if (a == b) {
8184
return a;
@@ -105,15 +108,15 @@ private static void updateState() {
105108
changed = true;
106109

107110
int current = charge;
108-
minecraft.schedule(() -> DynamicFPSMod.onBatteryChargeChanged(current, newCharge));
111+
Threads.runOnMainThread(() -> DynamicFPSMod.onBatteryChargeChanged(current, newCharge));
109112
}
110113

111114
if (readInitialData && status != newStatus) {
112115
changed = true;
113116

114117
State current = status;
115118
State updated = newStatus;
116-
minecraft.schedule(() -> DynamicFPSMod.onBatteryStatusChanged(current, updated));
119+
Threads.runOnMainThread(() -> DynamicFPSMod.onBatteryStatusChanged(current, updated));
117120
}
118121

119122
charge = newCharge;
@@ -177,7 +180,7 @@ private static Manager createManager() {
177180
path = "no_library";
178181
}
179182

180-
ErrorToast.queueToast(localized("toast", path));
183+
Threads.runOnMainThread(() -> ErrorToast.queueToast(localized("toast", path)));
181184
}
182185

183186
return result;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package dynamic_fps.impl.util;
2+
3+
import net.minecraft.client.Minecraft;
4+
5+
public class Threads {
6+
/**
7+
* Schedule a task on the main thread.
8+
*/
9+
public static void runOnMainThread(Runnable runnable) {
10+
Minecraft.getInstance().schedule(runnable);
11+
}
12+
13+
/**
14+
* Create a thread and immediately start it.
15+
*/
16+
public static Thread create(String name, Runnable runnable) {
17+
Thread thread = new Thread(runnable, "dynamic-fps-" + name);
18+
thread.start();
19+
return thread;
20+
}
21+
}

0 commit comments

Comments
 (0)