Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-108724: Use _PyTime_GetMonotonicClock() in parking_lot.c #112222

Closed
wants to merge 1 commit into from

Conversation

vstinner
Copy link
Member

@vstinner vstinner commented Nov 17, 2023

Using a system clock causes issues when it's being updated by the system administrator, NTP, Daylight Saving Time, or anything else. Sadly, on Windows, the monotonic clock resolution is around 15.6 ms.

Example: #85876

Using a system clock causes issues when it's being updated by the
system administrator, NTP, Daylight Saving Time, or anything
else. Sadly, on Windows, the monotonic clock resolution is around
15.6 ms.

Example: python#85876
@vstinner
Copy link
Member Author

@colesbury @ericsnowcurrently: Please don't use the system clock for locks. It causes too many issues. Using a monotonic clock is more reliable. Sadly, on Windows, the monotonic clock has a resolution of 15.6 ms.

Copy link
Contributor

@colesbury colesbury left a comment

Choose a reason for hiding this comment

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

We should use the monotonic clock when available, but this change isn't sufficient:

  • sem_timedwait does not work with CLOCK_MONOTONIC. (Need sem_clockwait if available)
  • pthread_cond_t needs to be initialized with the right attribute

Comment on lines +121 to 124
_PyTime_t deadline = _PyTime_Add(_PyTime_GetMonotonicClock(), timeout);
_PyTime_AsTimespec(deadline, &ts);

err = sem_timedwait(&sema->platform_sem, &ts);
Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe:

# ifdef HAVE_SEM_CLOCKWAIT
        _PyTime_t deadline = _PyDeadline_Init(timeout);
        _PyTime_AsTimespec_clamp(deadline, &ts);
        err = sem_clockwait(&sema->platform_sem, CLOCK_MONOTONIC, &ts);
# else
        _PyTime_t deadline = _PyTime_Add(_PyTime_GetSystemClock(), timeout);
        _PyTime_AsTimespec_clamp(deadline, &ts);
        err = sem_timedwait(&sema->platform_sem, &ts);
 #endif

@vstinner
Copy link
Member Author

Oh. I made a mechanical change to avoid _PyTime_GetSystemClock(). I didn't see that timestamps are passed to existing functions such as pthread_cond_timedwait(). I mark my PR as a draft for now and will try to update it to address Sam's review

@vstinner vstinner marked this pull request as draft November 17, 2023 23:24
@vstinner vstinner closed this Dec 1, 2023
@vstinner vstinner deleted the monotonic_parking branch December 1, 2023 18:26
@vstinner
Copy link
Member Author

vstinner commented Dec 1, 2023

I don't have time to fix my PR right now. I may try again later ;-)

@colesbury
Copy link
Contributor

colesbury commented Dec 1, 2023

I wrote it up as an issue so that I don't forget about this and in case someone else wants to tackle it first: #112606

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants