mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-06-13 04:05:04 +03:00
Add stop functionality
This commit is contained in:
@@ -10,6 +10,8 @@ class BinaryPlugin:
|
||||
def __init__(self, plugin_directory, file_name, flags, logger) -> None:
|
||||
self.server = PluginProtocolServer(self)
|
||||
self.connection = None
|
||||
self.process = None
|
||||
|
||||
self.flags = flags
|
||||
self.logger = logger
|
||||
|
||||
@@ -18,7 +20,7 @@ class BinaryPlugin:
|
||||
|
||||
|
||||
async def start(self):
|
||||
if self.connection:
|
||||
if self.connection and self.connection.is_serving:
|
||||
self.connection.close()
|
||||
|
||||
self.unix_socket_path = BinaryPlugin.generate_socket_path()
|
||||
@@ -29,11 +31,20 @@ class BinaryPlugin:
|
||||
self.process = await subprocess.create_subprocess_exec(join(self.plugin_directory, self.file_name), env=env)
|
||||
get_event_loop().create_task(self.process_loop())
|
||||
|
||||
async def stop(self):
|
||||
self.stopped = True
|
||||
if self.connection and self.connection.is_serving:
|
||||
self.connection.close()
|
||||
|
||||
if self.process and self.process.is_alive:
|
||||
self.process.terminate()
|
||||
|
||||
async def process_loop(self):
|
||||
await self.process.wait()
|
||||
self.logger.info("backend process was killed - restarting in 10 seconds")
|
||||
await sleep(10)
|
||||
await self.start()
|
||||
if not self.stopped:
|
||||
self.logger.info("backend process was killed - restarting in 10 seconds")
|
||||
await sleep(10)
|
||||
await self.start()
|
||||
|
||||
def generate_socket_path():
|
||||
tmp_dir = mkdtemp("decky-plugin")
|
||||
|
||||
@@ -12,4 +12,7 @@ class PassivePlugin:
|
||||
pass
|
||||
|
||||
async def start(self):
|
||||
pass# Empty stub
|
||||
pass
|
||||
|
||||
async def stop(self):
|
||||
pass
|
||||
|
||||
@@ -53,6 +53,8 @@ class PythonPlugin:
|
||||
self.client = PluginProtocolClient(self, logger)
|
||||
self.server = PluginProtocolServer(self)
|
||||
self.connection = None
|
||||
self.process = None
|
||||
self.stopped = False
|
||||
|
||||
self.plugin_directory = plugin_directory
|
||||
self.file_name = file_name
|
||||
@@ -93,12 +95,22 @@ class PythonPlugin:
|
||||
self.process = multiprocessing.Process(target=self._init)
|
||||
self.process.start()
|
||||
get_event_loop().create_task(self.process_loop())
|
||||
self.stopped = False
|
||||
|
||||
async def stop(self):
|
||||
self.stopped = True
|
||||
if self.connection:
|
||||
self.connection.close()
|
||||
|
||||
if self.process and self.process.is_alive:
|
||||
self.process.terminate()
|
||||
|
||||
async def process_loop(self):
|
||||
await get_event_loop().run_in_executor(None, self.process.join)
|
||||
self.logger.info("backend process was killed - restarting in 10 seconds")
|
||||
await sleep(10)
|
||||
await self.start()
|
||||
if not self.stopped:
|
||||
self.logger.info("backend process was killed - restarting in 10 seconds")
|
||||
await sleep(10)
|
||||
await self.start()
|
||||
|
||||
# called on the server/loader process
|
||||
async def call_method(self, method_name, method_args):
|
||||
|
||||
@@ -30,5 +30,8 @@ class PluginWrapper:
|
||||
def start(self):
|
||||
return self.backend.start()
|
||||
|
||||
def stop(self):
|
||||
return self.backend.stop()
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.name
|
||||
|
||||
Reference in New Issue
Block a user