From 60406cb9825869714a68d191da55e91def0afb9b Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Thu, 2 Jul 2026 10:44:59 -0500 Subject: [PATCH] Memory Hither --- system/manager/process_config.py | 14 +++++++++----- system/manager/test/test_manager.py | 27 ++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/system/manager/process_config.py b/system/manager/process_config.py index cfce04dc6..d5b33cd90 100644 --- a/system/manager/process_config.py +++ b/system/manager/process_config.py @@ -33,14 +33,12 @@ def python_ui_enabled(device_type: str) -> bool: return device_type not in ("tici", "tizi") -def python_process_start_method(uses_python_ui: bool, is_pc: bool = PC) -> str: - # Native/QT UI devices rely on fork copy-on-write to keep onroad memory low. - # Python/raylib UI uses subprocess to avoid fork/import-lock boot hangs. +def python_ui_process_start_method(uses_python_ui: bool, is_pc: bool = PC) -> str: return "fork" if is_pc or not uses_python_ui else "subprocess" PYTHON_UI = python_ui_enabled(device_type) -os.environ.setdefault("PYTHON_PROCESS_START_METHOD", python_process_start_method(PYTHON_UI)) +PYTHON_UI_PROCESS_START_METHOD = python_ui_process_start_method(PYTHON_UI) from openpilot.system.manager.process import PythonProcess, NativeProcess, DaemonProcess @@ -176,7 +174,13 @@ procs += [ ] if PYTHON_UI: - procs.append(PythonProcess("ui", "selfdrive.ui.ui", always_run, watchdog_max_dt=UI_WATCHDOG_MAX_DT)) + procs.append(PythonProcess( + "ui", + "selfdrive.ui.ui", + always_run, + watchdog_max_dt=UI_WATCHDOG_MAX_DT, + start_method=PYTHON_UI_PROCESS_START_METHOD, + )) else: procs.append(NativeProcess("ui", "selfdrive/ui", ["./ui"], always_run, watchdog_max_dt=UI_WATCHDOG_MAX_DT)) diff --git a/system/manager/test/test_manager.py b/system/manager/test/test_manager.py index 375bc4611..d4fde7810 100644 --- a/system/manager/test/test_manager.py +++ b/system/manager/test/test_manager.py @@ -9,7 +9,13 @@ from cereal import car from openpilot.common.params import Params, ParamKeyFlag import openpilot.system.manager.manager as manager from openpilot.system.manager.process import ensure_running -from openpilot.system.manager.process_config import managed_processes, procs, python_process_start_method, python_ui_enabled +from openpilot.system.manager.process import PythonProcess +from openpilot.system.manager.process_config import ( + managed_processes, + procs, + python_ui_enabled, + python_ui_process_start_method, +) from openpilot.system.hardware import HARDWARE os.environ['FAKEUPLOAD'] = "1" @@ -111,10 +117,21 @@ class TestManager: assert names.index("the_galaxy") < ui_idx assert names.index("galaxy") < ui_idx - def test_python_process_start_method_follows_ui_implementation(self): - assert python_process_start_method(False, False) == "fork" - assert python_process_start_method(True, False) == "subprocess" - assert python_process_start_method(True, True) == "fork" + def test_python_ui_process_start_method_follows_ui_implementation(self): + assert python_ui_process_start_method(False, False) == "fork" + assert python_ui_process_start_method(True, False) == "subprocess" + assert python_ui_process_start_method(True, True) == "fork" + + def test_python_ui_subprocess_is_scoped_to_ui(self): + ui_proc = managed_processes["ui"] + uses_python_ui = python_ui_enabled(HARDWARE.get_device_type()) + + assert isinstance(ui_proc, PythonProcess) == uses_python_ui + if uses_python_ui: + assert ui_proc.start_method == python_ui_process_start_method(uses_python_ui) + for proc in procs: + if isinstance(proc, PythonProcess) and proc.name != "ui": + assert proc.start_method is None def test_python_ui_env_override(self, monkeypatch): monkeypatch.setenv("USE_RAYLIB_UI", "1")