From 9ef0eff2f56efe8c6daabea25ee0e641af778254 Mon Sep 17 00:00:00 2001 From: m4ko Date: Tue, 15 Sep 2026 21:48:27 +0200 Subject: [PATCH] Fixed a issue with resource exhaustion for directx. --- src/ptlinux/application/commands/play.py | 42 +++++++++++++++++++---- updates/stable.json | 26 +++++++------- updates/stable.json.sig | Bin 384 -> 384 bytes 3 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/ptlinux/application/commands/play.py b/src/ptlinux/application/commands/play.py index 10bdd27..b7990a7 100644 --- a/src/ptlinux/application/commands/play.py +++ b/src/ptlinux/application/commands/play.py @@ -394,6 +394,7 @@ def play_locked( if recommended_comparison is not None: runtime_issues["recommended_one_variable_comparison"] = recommended_comparison clean_exit = outcome.returncode == 0 and current_game_crash is None + session_issue = game_log_issue_reason(current_game_log) launch_evidence = game_readiness_signal if launch_evidence is None and current_game_log is not None: launch_evidence = "game_log" @@ -402,6 +403,8 @@ def play_locked( launch_succeeded = launch_evidence is not None report = { "ok": clean_exit, + "degraded": session_issue is not None, + "session_issue": session_issue, "launch_succeeded": launch_succeeded, "dry_run": dry_run, "runtime": asdict(selection), @@ -430,6 +433,7 @@ def play_locked( **window_launch_metadata, "runtime_seconds": round(game_runtime_seconds), "clean_exit": clean_exit, + "degraded": session_issue is not None, "timed_out": outcome.timed_out, "launch_succeeded": launch_succeeded, "game_window_ready": game_window_ready, @@ -440,7 +444,7 @@ def play_locked( "realm": start_option.name, **api._game_exit_metadata(outcome.returncode, selection.kind), } - if not clean_exit: + if not clean_exit or session_issue is not None: common_game_metadata["failure_reason"] = game_failure_reason( outcome, current_game_log, @@ -516,6 +520,10 @@ def play_locked( exit_message = game_crash_message(current_game_log) elif outcome.timed_out: exit_message = "Game session timed out" + elif session_issue == "direct3d_resource_exhaustion": + exit_message = ( + "Game client exited after logging Direct3D resource exhaustion" + ) elif common_game_metadata.get("signal_inferred") is True: signal_wrapper = ( "Proton" if selection.kind == "proton7" else "UMU" @@ -537,12 +545,14 @@ def play_locked( severity=( "error" if current_game_crash is not None - else "info" if clean_exit else "warning" + else "warning" + if not clean_exit or session_issue is not None + else "info" ), message=exit_message, metadata=( common_game_metadata - if clean_exit + if clean_exit and session_issue is None else { **common_game_metadata, **failure_evidence, @@ -646,7 +656,7 @@ def game_failure_reason( current_game_crash: dict[str, object] | None, exit_metadata: dict[str, object], ) -> str: - """Classify the strongest evidence recorded for a failed game session.""" + """Classify the strongest evidence recorded for a failed or degraded session.""" if current_game_log and current_game_log.get("runtime_out_of_memory") is True: return "direct3d_resource_exhaustion" @@ -659,6 +669,16 @@ def game_failure_reason( return "nonzero_exit" +def game_log_issue_reason( + current_game_log: dict[str, object] | None, +) -> str | None: + """Classify native-log evidence that degraded an otherwise clean process exit.""" + + if current_game_log and current_game_log.get("runtime_out_of_memory") is True: + return "direct3d_resource_exhaustion" + return None + + def game_crash_message(current_game_log: dict[str, object] | None) -> str: if ( current_game_log is not None @@ -971,6 +991,16 @@ def print_game_outcome( ) elif outcome.timed_out: print("Game client timed out and was stopped.", file=sys.stderr) + elif ( + outcome.returncode == 0 + and game_log_issue_reason(current_game_log) + == "direct3d_resource_exhaustion" + ): + print( + "Game client exited with status 0 after logging Direct3D resource " + "exhaustion.", + file=sys.stderr, + ) elif outcome.returncode == 0: print("Game client exited normally.") elif outcome.returncode is None: @@ -1039,8 +1069,8 @@ def print_interrupted_game_log(report: dict[str, object]) -> None: print( "Detected Direct3D resource exhaustion in the 32-bit game process" + effect_text - + ". Restarting the client can recover temporarily; depot repair will not " - "fix this failure.", + + ". Restarting clears the process address space, but this condition can " + "recur; depot repair will not fix it.", file=sys.stderr, ) elif report["managed_asset_integrity_failed"]: diff --git a/updates/stable.json b/updates/stable.json index e0b165b..623bf79 100644 --- a/updates/stable.json +++ b/updates/stable.json @@ -3,15 +3,15 @@ "archive": { "layout": "flat", "name": "PristonTale-EU-1.0.5.tar.gz", - "sha256": "31414eefc52325a532ded83166d083c4d8d4a6699bfa92d619197b879e6d6578", - "size": 1544157, - "url": "https://git.m4ko.net/m4ko/pristontale-eu-linux/releases/download/v1.0.5/PristonTale-EU-1.0.5.tar.gz?sha256=31414eefc52325a532ded83166d083c4d8d4a6699bfa92d619197b879e6d6578" + "sha256": "39c9960025f412ff40452fdde0655cb7b6d8c92643add7093d44f8f5bebb8d97", + "size": 1544294, + "url": "https://git.m4ko.net/m4ko/pristontale-eu-linux/releases/download/v1.0.5/PristonTale-EU-1.0.5.tar.gz?sha256=39c9960025f412ff40452fdde0655cb7b6d8c92643add7093d44f8f5bebb8d97" }, - "archive_sha256": "31414eefc52325a532ded83166d083c4d8d4a6699bfa92d619197b879e6d6578", - "archive_size": 1544157, - "archive_url": "https://git.m4ko.net/m4ko/pristontale-eu-linux/releases/download/v1.0.5/PristonTale-EU-1.0.5.tar.gz?sha256=31414eefc52325a532ded83166d083c4d8d4a6699bfa92d619197b879e6d6578", + "archive_sha256": "39c9960025f412ff40452fdde0655cb7b6d8c92643add7093d44f8f5bebb8d97", + "archive_size": 1544294, + "archive_url": "https://git.m4ko.net/m4ko/pristontale-eu-linux/releases/download/v1.0.5/PristonTale-EU-1.0.5.tar.gz?sha256=39c9960025f412ff40452fdde0655cb7b6d8c92643add7093d44f8f5bebb8d97", "channel": "stable", - "commit": "67d89b40d54f1bf6d1886cd2cdbd35b0fa8b4324", + "commit": "06469a0ad3befa84af0303a3afa100f4b9a7b182", "compatibility": { "config_schema": 1, "manifest_schema": 1, @@ -71,8 +71,8 @@ }, { "path": "ptlinux/application/commands/play.py", - "sha256": "7591103e801972398c2d1bd683518b9149c0903b3f6bd3de79c185f66c0b42f6", - "size": 34941 + "sha256": "83ec468e7748c9e02106323bf235bef14503b08a31be3566b3b1a1eccd1cdb4b", + "size": 35941 }, { "path": "ptlinux/application/commands/settings.py", @@ -696,17 +696,17 @@ }, { "path": "release.json", - "sha256": "3cf9be35e4a0db075d79956b11f8d21c9ae4c8be5169690300bae335df6e7d01", + "sha256": "c579ddbd86892713e30b04fb962895488a78cdad9744c880507b058328c27579", "size": 218 } ], "minimum_updater_version": "0.9.9", "notes_url": "https://git.m4ko.net/m4ko/pristontale-eu-linux/releases/tag/v1.0.5", - "published_at": "2026-09-15T19:15:39Z", + "published_at": "2026-09-15T19:29:05Z", "release": { - "notes_markdown": "# PristonTale EU Launcher 1.0.5\n\nAdds opt-in, bounded game crash-dump attachments for telemetry, improves game-exit diagnostics and Proton 7 crash classification, and packages the current launcher, runtime compatibility, and native helper updates.\n\n## Changes\n\n- Updated telemetry to support game dumps. (`67d89b4`)\n- Released version 1.0.2 (`c278efa`)\n- Reworked some game window and gamescope methods for Cinnamon. (`f3059c3`)\n- Added more folders and restructured classes inside them. (`2cbb931`)\n- Reworked the project structure. (`be7a478`)\n- Delete RELEASE_PIPELINE_WORKPLAN.md (`15741f5`)\n- Add channel-aware release tooling and updater recovery (`0a89323`)\n- Publish signed launcher release history (`cc48bf4`)\n- Upload files to \"updates\" (`84f8de5`)\n- Delete updates/stable.json.sig (`1329485`)\n- Delete updates/stable.json (`8f1655b`)\n- Fix v0.9.11 archive download cache (`be71d31`)\n- Upload files to \"updates\" (`46e11ae`)\n- Delete updates/stable.json.sig (`eeb993e`)\n- Delete updates/stable.json (`a90bd19`)\n\n---\n\nVersion: `1.0.5` \nChannel: `stable` \nTag: `v1.0.5` \nSource commit: `67d89b40d54f1bf6d1886cd2cdbd35b0fa8b4324`\n", + "notes_markdown": "# PristonTale EU Launcher 1.0.5\n\nAdds opt-in, bounded game crash-dump attachments for telemetry, correctly reports clean process exits with Direct3D resource exhaustion as degraded sessions, and packages the current launcher, runtime compatibility, and native helper updates.\n\n## Changes\n\n- Updated to version: 1.0.5 (`06469a0`)\n- Added crash dumps class. (`f7ceba2`)\n- Updated telemetry to support game dumps. (`67d89b4`)\n- Released version 1.0.2 (`c278efa`)\n- Reworked some game window and gamescope methods for Cinnamon. (`f3059c3`)\n- Added more folders and restructured classes inside them. (`2cbb931`)\n- Reworked the project structure. (`be7a478`)\n- Delete RELEASE_PIPELINE_WORKPLAN.md (`15741f5`)\n- Add channel-aware release tooling and updater recovery (`0a89323`)\n- Publish signed launcher release history (`cc48bf4`)\n- Upload files to \"updates\" (`84f8de5`)\n- Delete updates/stable.json.sig (`1329485`)\n- Delete updates/stable.json (`8f1655b`)\n- Fix v0.9.11 archive download cache (`be71d31`)\n- Upload files to \"updates\" (`46e11ae`)\n- Delete updates/stable.json.sig (`eeb993e`)\n- Delete updates/stable.json (`a90bd19`)\n\n---\n\nVersion: `1.0.5` \nChannel: `stable` \nTag: `v1.0.5` \nSource commit: `06469a0ad3befa84af0303a3afa100f4b9a7b182`\n", "release_notes_url": "https://git.m4ko.net/m4ko/pristontale-eu-linux/releases/tag/v1.0.5", - "summary": "Adds opt-in, bounded game crash-dump attachments for telemetry, improves game-exit diagnostics and Proton 7 crash classification, and packages the current launcher, runtime compatibility, and native helper updates.", + "summary": "Adds opt-in, bounded game crash-dump attachments for telemetry, correctly reports clean process exits with Direct3D resource exhaustion as degraded sessions, and packages the current launcher, runtime compatibility, and native helper updates.", "title": "PristonTale EU Launcher 1.0.5" }, "schema": 1, diff --git a/updates/stable.json.sig b/updates/stable.json.sig index ce7a914b4ed1f15d89b106857b8ce72624d12d16..acdaa1d78eff99b019b6372f781a2287a4666ce0 100644 GIT binary patch literal 384 zcmV-`0e}99(*UcCKo=BXvaR$s+I9f{JRaI4%dknYooxpW1XDoW{^v%xDZ4vQ16gZK z*v??>i)TFBoxyhs3(AogY#0|_eC>0!UG3TQ;_y6j5aA2U7xr%O+qyDaDpylupQk#= zr#JSJC298&_P1Q|!LJ${nFveQWMV-<&?D(8yJy*z+9Ets?I9z~zLmn&tKQzFGt4~r zGF=XL?88^m6kYFvL8Xq!yM}w)E18B6n4%-8r$PpmttC`8!x+qmK%a>|njcNVXyt^Z zG&KJCu>1^D)sZBd?gb=dIoC_%Y6n`nR|4r@Ur#CF6GJ}c#(+g^F6x@mzsC8ECZiQq zCoHNclrJB9)2@-QV$Zrfat2}ccUPNj^)E_FFr^@w;C_yC`UM;3vmB4Ma(L$%^RT(6 zKtkidG6iJml0Bv{aKPlUmRU1*@bc2=-ZD|c!Qre&>D#)4R)pW047wM+j18d};0%Ci e!1|s_)AgHKrBg#iw8F@$g2e=SsczHwe;lfBQR*0wG)5 z!3a@Q`;<2fTRwBM$23Hf>>;E+IzSc5`Q6MvRUTL1q5lu%W=+EDr7-7Q2tDN@0VvB{ z@HZkU2D|c}U>v+q-k4@m=C3UhYDhU54MGiz?T;FQhOUw$&A}FsGlrHY%O!<7n8-tMINXw{Q02-FT+W5p101#L)c@ ztpT^0el(yf#S%8AH7M|dU!e5e)9PRxoQSHZdx%Pw7uIO$sfKv_J48iBXpQZg@KnMI eCP7=+qT91YfAULyVPS@)4U!RTqW0hogi0*1iNR_B