mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-11 23:11:56 +00:00
* Fix LimitOverrunError when a lot of data is passed to the backend * Raise socket's buffer limit to something more sensible
This commit is contained in:
+31
-5
@@ -1,7 +1,7 @@
|
|||||||
import multiprocessing
|
import multiprocessing
|
||||||
from asyncio import (Lock, get_event_loop, new_event_loop,
|
from asyncio import (Lock, get_event_loop, new_event_loop,
|
||||||
open_unix_connection, set_event_loop, sleep,
|
open_unix_connection, set_event_loop, sleep,
|
||||||
start_unix_server)
|
start_unix_server, IncompleteReadError, LimitOverrunError)
|
||||||
from concurrent.futures import ProcessPoolExecutor
|
from concurrent.futures import ProcessPoolExecutor
|
||||||
from importlib.util import module_from_spec, spec_from_file_location
|
from importlib.util import module_from_spec, spec_from_file_location
|
||||||
from json import dumps, load, loads
|
from json import dumps, load, loads
|
||||||
@@ -12,6 +12,8 @@ from time import time
|
|||||||
|
|
||||||
multiprocessing.set_start_method("fork")
|
multiprocessing.set_start_method("fork")
|
||||||
|
|
||||||
|
BUFFER_LIMIT = 2 ** 20 # 1 MiB
|
||||||
|
|
||||||
class PluginWrapper:
|
class PluginWrapper:
|
||||||
def __init__(self, file, plugin_directory, plugin_path) -> None:
|
def __init__(self, file, plugin_directory, plugin_path) -> None:
|
||||||
self.file = file
|
self.file = file
|
||||||
@@ -62,11 +64,23 @@ class PluginWrapper:
|
|||||||
get_event_loop().run_forever()
|
get_event_loop().run_forever()
|
||||||
|
|
||||||
async def _setup_socket(self):
|
async def _setup_socket(self):
|
||||||
self.socket = await start_unix_server(self._listen_for_method_call, path=self.socket_addr)
|
self.socket = await start_unix_server(self._listen_for_method_call, path=self.socket_addr, limit=BUFFER_LIMIT)
|
||||||
|
|
||||||
async def _listen_for_method_call(self, reader, writer):
|
async def _listen_for_method_call(self, reader, writer):
|
||||||
while True:
|
while True:
|
||||||
data = loads((await reader.readline()).decode("utf-8"))
|
line = bytearray()
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
line.extend(await reader.readuntil())
|
||||||
|
except LimitOverrunError:
|
||||||
|
line.extend(await reader.read(reader._limit))
|
||||||
|
continue
|
||||||
|
except IncompleteReadError as err:
|
||||||
|
line.extend(err.partial)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
data = loads(line.decode("utf-8"))
|
||||||
if "stop" in data:
|
if "stop" in data:
|
||||||
get_event_loop().stop()
|
get_event_loop().stop()
|
||||||
while get_event_loop().is_running():
|
while get_event_loop().is_running():
|
||||||
@@ -88,7 +102,7 @@ class PluginWrapper:
|
|||||||
retries = 0
|
retries = 0
|
||||||
while retries < 10:
|
while retries < 10:
|
||||||
try:
|
try:
|
||||||
self.reader, self.writer = await open_unix_connection(self.socket_addr)
|
self.reader, self.writer = await open_unix_connection(self.socket_addr, limit=BUFFER_LIMIT)
|
||||||
return True
|
return True
|
||||||
except:
|
except:
|
||||||
await sleep(2)
|
await sleep(2)
|
||||||
@@ -121,7 +135,19 @@ class PluginWrapper:
|
|||||||
self.writer.write(
|
self.writer.write(
|
||||||
(dumps({"method": method_name, "args": kwargs})+"\n").encode("utf-8"))
|
(dumps({"method": method_name, "args": kwargs})+"\n").encode("utf-8"))
|
||||||
await self.writer.drain()
|
await self.writer.drain()
|
||||||
res = loads((await self.reader.readline()).decode("utf-8"))
|
line = bytearray()
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
line.extend(await self.reader.readuntil())
|
||||||
|
except LimitOverrunError:
|
||||||
|
line.extend(await self.reader.read(self.reader._limit))
|
||||||
|
continue
|
||||||
|
except IncompleteReadError as err:
|
||||||
|
line.extend(err.partial)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
res = loads(line.decode("utf-8"))
|
||||||
if not res["success"]:
|
if not res["success"]:
|
||||||
raise Exception(res["res"])
|
raise Exception(res["res"])
|
||||||
return res["res"]
|
return res["res"]
|
||||||
|
|||||||
Reference in New Issue
Block a user