Skip to content

[3.15] gh-161712: Read the clock once in ThreadHandle_join() - #161771

Merged
ZeroIntensity merged 1 commit into
python:3.15from
aozmekik:backport-161712-3.15
Nov 12, 2026
Merged

ZeroIntensity merged 1 commit into
python:3.15from
aozmekik:backport-161712-3.15

Conversation

@aozmekik

@aozmekik aozmekik commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Py_MAX() evaluates _PyDeadline_Get() twice. If the deadline passes between the two calls, the first value passes the > 0 check and the second, negative one becomes the timeout, which PyEvent_WaitTimed() takes as no timeout, so Thread.join(timeout) blocks forever. main has read the clock once since gh-157495 (GH-157591), which wasn't backported because it was a cleanup. This is that hunk, with a NEWS entry.

The window is too small to hit from a test, so I forced it under gdb: a signal wakes the join loop of join(3.0) after a second, and the second clock read in that loop reports the deadline as passed. On 3.15 as it is, the join was still blocked after 30 seconds. With this change it returns after 3 seconds. test_threading and test_thread pass.

Py_MAX() evaluated _PyDeadline_Get() twice. If the deadline passed
between the two calls, the negative second value was used as the
timeout, which means no timeout, and Thread.join(timeout) could block
forever. main already reads it once since pythongh-157495.
@ZeroIntensity

Copy link
Copy Markdown
Member

This looks good, but please open a new PR against the main branch; even though main isn't affected, it's nice to have consistency across branches (and it makes backporting easier). I think there was talk of reverting #157591 anyway, so it'd be good to have future-proofing in place (especially if there's no test case).

I'm going to close this so you're not tempted to change the base or head branch (doing so would ping all the codeowners!). Feel free to tag me on the new PR, and I'll merge it.

@ZeroIntensity ZeroIntensity left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I didn't realize that this already happened on main a little while ago.

@ZeroIntensity
ZeroIntensity enabled auto-merge (squash) November 11, 2026 16:46
@ZeroIntensity ZeroIntensity added the needs backport to 3.14 bugs and security fixes label Nov 12, 2026
@ZeroIntensity
ZeroIntensity merged commit 88d137a into python:3.15 Nov 12, 2026
137 of 157 checks passed
@miss-islington-app

Copy link
Copy Markdown

Thanks @aozmekik for the PR, and @ZeroIntensity for merging it 🌮🎉.. I'm working now to backport this PR to: 3.14.
🐍🍒⛏🤖

@bedevere-app

bedevere-app Bot commented Nov 12, 2026

Copy link
Copy Markdown

GH-161843 is a backport of this pull request to the 3.14 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.14 bugs and security fixes label Nov 12, 2026
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.

2 participants