Skip to content

CI trial only: PySide6 6.12.0 on the main workflows (do not merge) - #555

Closed
JE-Chen wants to merge 114 commits into
mainfrom
trial/pyside6-6.12
Closed

JE-Chen wants to merge 114 commits into
mainfrom
trial/pyside6-6.12

Conversation

@JE-Chen

@JE-Chen JE-Chen commented Nov 14, 2026

Copy link
Copy Markdown
Member

Do not merge. A CI-only trial that runs docker.yml and stable.yml on PySide6 6.12.0; it is closed once their results are in. The change itself is reviewed in draft PR #554 (trial/pyside6-6.12 → dev), and reaches main through PR #552 only if every square exits cleanly.

It carries the dev commits PR #552 carries, plus one commit moving the gui pin from PySide6 6.11.2 to 6.12.0 (and dropping the dependabot ignore). The exit crash that held the pin back -- tabs kept alive by slots holding themselves, deleted twice in Qt's teardown -- is fixed on dev in 553096a.

The worker keeps its captured context, deferred authority and terminal
outcome, but is now a plain callable that start_until_stopped hands the
stop event; Cancel and the panel's destruction set it, and the panel
stays busy until the comparison has unwound.
TabTask gains a progress signal, and start_until_stopped can hand the
work a report callable. The journal reader becomes a plain callable on
it, keeping its captured authority, record-boundary checkpoints and
single terminal outcome.
The worker keeps its captured authority, its checkpoints and the rule
that a committed export reports success, but becomes a plain callable
given the stop event and a progress report; the panel stays busy until
cancelled work has unwound.
The worker keeps its captured authority, its checkpoints before atomic
writes and the rule that a committed transition reports success, but
becomes a plain callable given the stop event and a progress report.
The worker keeps its refreshed authority, secret masking and guarded
delivery, but becomes a plain callable given the stop event. No GUI
module outside the task controllers calls start_worker any more.
Only Diagnostics published execution details. Every page's background
work now runs on TabTask, so the task publishes it for the page it runs
on: running, stopping, then succeeded, cancelled or the error, with
reported progress. Also fix the thumbnail probe that still read the
attribute removed when the poll became a task.
A page waiting for its first command showed a blank grid, with nothing
to tell an empty result from one still to come. The workspace now gives
every item view an empty state that hides as soon as a row arrives.
A failure or an RBAC refusal showed only in each panel's own status
line, if it had one. A banner under the page header now reports the
last failed run, and inside an RBAC scope names the commands the
active role cannot run.
Measured against main, the redesigned GUI starts in 1.37 s instead of
2.10 s with 115 MB instead of 179 MB, but a theme switch with every tab
open took 1.9 s: the window's style sheet was set twice, once for the
theme and again for the font. Setting it once brings it to 0.95 s.
Add the feature parity gate the F4 plan called for.
The freed-thread-state abort seen on Windows 3.14.8 left only the
Python lines faulthandler prints; Linux jobs already run under GDB.
Windows Error Reporting now writes a minidump of a crashed python.exe
into the native artifact the job retains after a failure.
Stopping a host or closing a viewer joins its threads for up to two
seconds, and Quick Connect and the Viewer tab did both in the button
slot. The registry can now free a slot at once and hand back the
blocking shutdown, which runs on a worker; a new connect closes the
session it replaces on its own worker before connecting.
Once begun, a TCP or WebSocket upload streamed to its last byte even
after the page closed or the session was dropped. send_file now checks
between chunks and, once stopped, sends a cancelled end so the host
discards the partial file.
A session being replaced closes on a worker while the next connects;
its last frames painted into the new window and its closing error ran
Disconnect, which closed the new session. Each session's callbacks now
carry its number, and only the current session's land.
The host panel dropped offers and disconnected sessions by id, resolved
only when the background stop ran, and a dropped offer could stop its
session on the GUI thread. It now uses the owned offers and retirements
the host already offers. A peer that failed to build also left its
token, subscription and a fresh screen source behind.
StopQueue and stop_each logged a stop that raised and dropped it, so a
session, recorder or host a panel had let go of could stay open with
nothing owning it. Failed stops are now kept with their error and the
authority they were queued under, and Diagnostics lists and retries
them.
Stops outside a StopQueue were still only reported or logged. A SlowOp
stop now opts into the stop custody as well as telling its panel, and
the WebRTC host keeps a dropped offer's or a disconnected session's
stop that failed; a start is never kept.
The advertiser stop logged a pending or uncertain retirement at debug
level and dropped the advertiser that still owned the name, and a
recording whose finalising raised left Record disabled with no outcome
shown. The advertiser now goes to the stop custody, and the recording
says it may be incomplete.
The Browse LAN dialog joined zeroconf's thread on the GUI thread,
swallowed a failed stop, and handed the browser a bound method that
kept the dialog alive. The browser now reports through a weak lease,
and its stop runs on an application-owned queue whose failures still
reach the stop custody after the dialog is gone.
A cancellation that cuts a media cleanup short carries the original
owners still holding resources, but the GUI kept only the outer stop.
Each attached owner is now kept by the stop custody with its own stop.
Reading a media owner's live retirement status can wait on the lock
its native cleanup holds. The custody now keeps the status the error
captured when it was raised, and Diagnostics shows that instead.
A full stop waits on native work under the owner's lock, and a caller
whose authority was revoked may never run it; until then the owner kept
admitting audio, reports, sessions and input. close_admission() only
stops admission, with no native call or cleanup lock, and StopQueue
calls it on every owner before queuing the stop.
A GUI task's Stop or deadline cancelled its scope, but the HTTP helper
and the signaling long-polls never looked at it, and stopping the WebRTC
host left its publish loop waiting up to ten minutes for an answer.
perform_call now checks the scope around each request, and the waits
check their stop between polls.
A Qt connection holds its slot from C++, out of the collector's sight.
The Script Builder connected a lambda over self to each of its 714
Add-step actions, so every tab built lived until exit, where Qt's
teardown released the closure inside a destructor and deleted the tab
a second time. Those slots, and the similar ones in four other tabs,
are now methods or weak references.
The pin to 6.11.2 waited on finding what crashed the test process at
interpreter exit under 6.12. That was tabs kept alive by slots holding
themselves, fixed on dev; this branch runs the full matrix on 6.12.0
before the pin moves.
Every 3.12 to 3.14 square passed and exited cleanly on 6.12.0, but both
3.11 squares still abort: a None refcount underflow that is harmless
where None is immortal. The pin now takes 6.12.0 only from 3.12 on.
@sonarqubecloud

Copy link
Copy Markdown

@JE-Chen JE-Chen closed this Nov 15, 2026
@JE-Chen
JE-Chen deleted the trial/pyside6-6.12 branch November 15, 2026 02:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant