diff options
| author | Jonas Dellinger <jonas.dellinger@2trde.com> | 2022-06-13 10:57:16 +0200 |
|---|---|---|
| committer | Jonas Dellinger <jonas.dellinger@2trde.com> | 2022-06-13 10:57:16 +0200 |
| commit | a95bf94d878f61869895bb22cbff1b4f524c5dca (patch) | |
| tree | a9fe1e59001b4f0af0d62413eb7c3a643232fad5 | |
| parent | 12f4c7faff1d217d46d11dace081a530db62bd7e (diff) | |
| download | decky-loader-a95bf94d878f61869895bb22cbff1b4f524c5dca.tar.gz decky-loader-a95bf94d878f61869895bb22cbff1b4f524c5dca.zip | |
fix(loader): multiprocessing.set_start_method once, queue for plugin import
| -rw-r--r-- | backend/plugin.py | 2 | ||||
| -rw-r--r-- | frontend/package.json | 3 | ||||
| -rw-r--r-- | frontend/src/plugin-loader.tsx | 40 |
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) { |
