summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Dellinger <jonas.dellinger@2trde.com>2022-06-13 10:57:16 +0200
committerJonas Dellinger <jonas.dellinger@2trde.com>2022-06-13 10:57:16 +0200
commita95bf94d878f61869895bb22cbff1b4f524c5dca (patch)
treea9fe1e59001b4f0af0d62413eb7c3a643232fad5
parent12f4c7faff1d217d46d11dace081a530db62bd7e (diff)
downloaddecky-loader-a95bf94d878f61869895bb22cbff1b4f524c5dca.tar.gz
decky-loader-a95bf94d878f61869895bb22cbff1b4f524c5dca.zip
fix(loader): multiprocessing.set_start_method once, queue for plugin import
-rw-r--r--backend/plugin.py2
-rw-r--r--frontend/package.json3
-rw-r--r--frontend/src/plugin-loader.tsx40
3 files changed, 33 insertions, 12 deletions
diff --git a/backend/plugin.py b/backend/plugin.py
index fb636a4c..11c94a05 100644
--- a/backend/plugin.py
+++ b/backend/plugin.py
@@ -10,6 +10,7 @@ from signal import SIGINT, signal
from sys import exit
from time import time
+multiprocessing.set_start_method("fork")
class PluginWrapper:
def __init__(self, file, plugin_directory, plugin_path) -> None:
@@ -87,7 +88,6 @@ class PluginWrapper:
def start(self):
if self.passive:
return self
- multiprocessing.set_start_method("fork")
multiprocessing.Process(target=self._init).start()
return self
diff --git a/frontend/package.json b/frontend/package.json
index 858997fa..6fbfe717 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -31,7 +31,8 @@
},
"importSort": {
".js, .jsx, .ts, .tsx": {
- "style": "module"
+ "style": "module",
+ "parser": "typescript"
}
},
"dependencies": {
diff --git a/frontend/src/plugin-loader.tsx b/frontend/src/plugin-loader.tsx
index bdefc0b6..73f65415 100644
--- a/frontend/src/plugin-loader.tsx
+++ b/frontend/src/plugin-loader.tsx
@@ -21,6 +21,10 @@ class PluginLoader extends Logger {
private routerHook: RouterHook = new RouterHook();
private deckyState: DeckyState = new DeckyState();
+ private reloadLock: boolean = false;
+ // stores a list of plugin names which requested to be reloaded
+ private pluginReloadQueue: string[] = [];
+
constructor() {
super(PluginLoader.name);
this.log('Initialized');
@@ -68,17 +72,33 @@ class PluginLoader extends Logger {
}
public async importPlugin(name: string) {
- this.log(`Trying to load ${name}`);
- let find = this.plugins.find((x) => x.name == name);
- if (find) this.plugins.splice(this.plugins.indexOf(find), 1);
- if (name.startsWith('$LEGACY_')) {
- await this.importLegacyPlugin(name.replace('$LEGACY_', ''));
- } else {
- await this.importReactPlugin(name);
+ try {
+ if (this.reloadLock) {
+ this.log('Reload currently in progress, adding to queue', name);
+ this.pluginReloadQueue.push(name);
+ return;
+ }
+
+ this.log(`Trying to load ${name}`);
+ let find = this.plugins.find((x) => x.name == name);
+ if (find) this.plugins.splice(this.plugins.indexOf(find), 1);
+ if (name.startsWith('$LEGACY_')) {
+ await this.importLegacyPlugin(name.replace('$LEGACY_', ''));
+ } else {
+ await this.importReactPlugin(name);
+ }
+ this.log(`Loaded ${name}`);
+
+ this.deckyState.setPlugins(this.plugins);
+ } catch (e) {
+ throw e;
+ } finally {
+ this.reloadLock = false;
+ const nextPlugin = this.pluginReloadQueue.shift();
+ if (nextPlugin) {
+ this.importPlugin(nextPlugin);
+ }
}
- this.log(`Loaded ${name}`);
-
- this.deckyState.setPlugins(this.plugins);
}
private async importReactPlugin(name: string) {