GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — threading.Lock.acquire(timeout) should use sem_clockwait(CLOCK_MONOTONIC) · Issue #85876 · python/cpython

threading.Lock.acquire(timeout) should use sem_clockwait(CLOCK_MONOTONIC) #85876

New issue
Copy link
New issue
Copy link
Closed
Closed
threading.Lock.acquire(timeout) should use sem_clockwait(CLOCK_MONOTONIC)#85876
Copy link
Labels
3.10 (EOL)end of lifeend of life3.11only security fixesonly security fixes3.9 (EOL)end of lifeend of lifeinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error

Description

wocket
mannequin
opened on Sep 4, 2020
Issue body actions
BPO 41710
Nosy @vstinner, @methane, @miss-islington, @mikecrowe
PRs
  • bpo-41710: Add _PyTime_AsTimespec_clamp() #28629
  • bpo-41710: Add pytime_add() and pytime_mul() #28642
  • bpo-41710: PyThread_acquire_lock_timed() clamps the timout #28643
  • bpo-41710: Fix building pytime.c on Windows #28644
  • bpo-41710: Document _PyTime_t API in pytime.h #28647
  • bpo-41710: PyThread_acquire_lock_timed() uses sem_clockwait() #28662
  • [3.10] bpo-41710: PyThread_acquire_lock_timed() uses sem_clockwait() #28671
  • [3.10] bpo-41710: Fix PY_TIMEOUT_MAX value on Windows #28672
  • bpo-41710: Fix PY_TIMEOUT_MAX on Windows #28673
  • bpo-41710: Add private _PyDeadline_Get() function #28674
  • bpo-41710: gc_collect_main() uses _PyTime_GetPerfCounter() #28676
  • [3.9] bpo-41710: PyThread_acquire_lock_timed() uses sem_clockwait() (GH-28671) #28683
  • bpo-41710: Fix What's New Entry credit #28962
  • Files
  • time_test.py
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2021-10-01.16:52:29.583>
    created_at = <Date 2020-09-04.08:34:54.835>
    labels = ['interpreter-core', 'type-bug', '3.9', '3.10', '3.11']
    title = 'threading.Lock.acquire(timeout) should use sem_clockwait(CLOCK_MONOTONIC)'
    updated_at = <Date 2021-12-06.13:27:11.081>
    user = 'https://bugs.python.org/wocket'

    bugs.python.org fields:

    activity = <Date 2021-12-06.13:27:11.081>
    actor = 'vstinner'
    assignee = 'none'
    closed = True
    closed_date = <Date 2021-10-01.16:52:29.583>
    closer = 'vstinner'
    components = ['Interpreter Core']
    creation = <Date 2020-09-04.08:34:54.835>
    creator = 'wocket'
    dependencies = []
    files = ['49440']
    hgrepos = []
    issue_num = 41710
    keywords = ['patch']
    message_count = 22.0
    messages = ['376338', '376340', '376394', '399405', '402925', '402926', '402931', '402939', '402942', '402987', '402995', '402997', '403001', '403003', '403009', '403011', '403012', '403021', '403022', '403023', '403962', '407802']
    nosy_count = 5.0
    nosy_names = ['vstinner', 'methane', 'miss-islington', 'wocket', 'mikecrowe']
    pr_nums = ['28629', '28642', '28643', '28644', '28647', '28662', '28671', '28672', '28673', '28674', '28676', '28683', '28962']
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'behavior'
    url = 'https://bugs.python.org/issue41710'
    versions = ['Python 3.9', 'Python 3.10', 'Python 3.11']

    Activity

    Next
    1. wocket commented on Sep 4, 2020

      @wocket
      wocketmannequin
      on Sep 4, 2020
      MannequinAuthor
      More actions

      The timeout for threading.Lock, threading.Condition, etc, is not using a monotonic clock — it is affected if the system time (realtime clock) is set.

      The attached program can be used to show the problem. It is expected to print "Took 2.000 s" repeatedly, but if run with permissions to set the system time, it prints:
      $ sudo ./time_test.py
      Took 2.400 s
      Took 1.657 s
      Took 2.044 s
      Took 2.401 s
      ...

      (the 1.6 s time can be explained by NTP correcting the clock)

      There are already a number of closed bugs for this and related issues: bpo-23428, bpo-31267, bpo-35747.

      This happens in Python 3.7.7 (ARM32, Yocto Warrior), Python 3.8.2 (AMD64, Ubuntu Linux 20.04) and Python v3.9.0rc1 (AMD64, Ubuntu Linux 20.04).

    2. wocket
      added
      3.8 (EOL)end of lifeend of life
      interpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)
      type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
      on Sep 4, 2020
    3. vstinner commented on Sep 4, 2020

      @vstinner
      vstinner
      on Sep 4, 2020
      Member
      More actions

      bpo-23428 modified the pthread implementation of conditional variable to use pthread_condattr_setclock(&ca, CLOCK_MONOTONIC) is available: commit 001fee1. The change should be part of Python 3.8.

      What is your sys.thread_info value? Example on Fedora 32 with Python 3.8.5:

      >>> sys.thread_info
      sys.thread_info(name='pthread', lock='semaphore', version='NPTL 2.31')

      Sadly, the semaphore implementation doesn't use monotonic clock. See glibc issues:

      • https://sourceware.org/bugzilla/show_bug.cgi?id=14717
      • https://bugzilla.kernel.org/show_bug.cgi?id=112521
    4. wocket commented on Sep 4, 2020

      @wocket
      wocketmannequin
      on Sep 4, 2020
      MannequinAuthor
      More actions
      sys.thread_info = sys.thread_info(name='pthread', lock='semaphore', version='NPTL 2.31') on my system. Looking at the source I think the semaphore implementation will be used on all modern Linux systems.

      In my tests it works as expected on a Macintosh (3.8.5 with lock='mutex+cond') and also if I force a Linux build to use the mutex+cond implementation by defining HAVE_BROKEN_POSIX_SEMAPHORES.

      Doesn't look like those glibc and Linux bug reports will get any attention anytime soon. I will find a workaround instead :-/

    5. mikecrowe commented on Aug 11, 2021

      @mikecrowe
      mikecrowemannequin
      on Aug 11, 2021
      Mannequin
      More actions

      glibc v2.30 onwards provides sem_clockwait which can wait on either CLOCK_MONOTONIC or CLOCK_REALTIME. I failed to notice that https://sourceware.org/bugzilla/show_bug.cgi?id=14717 existed until today. :(

    6. vstinner
      changed the title [-]Timeout is affected by jumps in system time[/-] [+]acquire(timeout) of threading.Lock and threading.Condition is affected by jumps in system time: Python should use sem_clockwait(CLOCK_MONOTONIC)[/+] on Sep 13, 2021
    7. vstinner
      changed the title [-]Timeout is affected by jumps in system time[/-] [+]acquire(timeout) of threading.Lock and threading.Condition is affected by jumps in system time: Python should use sem_clockwait(CLOCK_MONOTONIC)[/+] on Sep 13, 2021
    8. vstinner commented on Sep 30, 2021

      @vstinner
      vstinner
      on Sep 30, 2021
      Member
      More actions

      New changeset 09796f2 by Victor Stinner in branch 'main':
      bpo-41710: Add _PyTime_AsTimespec_clamp() (GH-28629)
      09796f2

    9. vstinner commented on Sep 30, 2021

      @vstinner
      vstinner
      on Sep 30, 2021
      Member
      More actions

      New changeset d62d925 by Victor Stinner in branch 'main':
      bpo-41710: Add pytime_add() and pytime_mul() (GH-28642)
      d62d925

    10. vstinner commented on Sep 30, 2021

      @vstinner
      vstinner
      on Sep 30, 2021
      Member
      More actions

      New changeset 0231b6d by Victor Stinner in branch 'main':
      bpo-41710: Fix building pytime.c on Windows (GH-28644)
      0231b6d

    11. 9 remaining items

    12. vstinner
      added
      3.11only security fixesonly security fixes
      on Oct 1, 2021
    13. vstinner commented on Oct 1, 2021

      @vstinner
      vstinner
      on Oct 1, 2021
      Member
      More actions

      There are already a number of closed bugs for this and related issues: bpo-23428, bpo-31267, bpo-35747.

      Fixed bpo-12822 modified threading.Condition.wait(timeout) to use a monotonic clock: use pthread_condattr_setclock(CLOCK_MONOTONIC). bpo-23428, bpo-31267 and bpo-35747 are duplicates of bpo-12822.

      This issue is about threading.Lock.acquire(timeout) which has a different implementation.

    14. vstinner commented on Oct 1, 2021

      @vstinner
      vstinner
      on Oct 1, 2021
      Member
      More actions

      New changeset 98d2827 by Victor Stinner in branch 'main':
      bpo-41710: Fix PY_TIMEOUT_MAX on Windows (GH-28673)
      98d2827

    15. vstinner commented on Oct 1, 2021

      @vstinner
      vstinner
      on Oct 1, 2021
      Member
      More actions

      New changeset 54957f1 by Victor Stinner in branch 'main':
      bpo-41710: gc_collect_main() uses _PyTime_GetPerfCounter() (GH-28676)
      54957f1

    16. vstinner commented on Oct 1, 2021

      @vstinner
      vstinner
      on Oct 1, 2021
      Member
      More actions

      New changeset 833fdf1 by Victor Stinner in branch 'main':
      bpo-41710: Add private _PyDeadline_Get() function (GH-28674)
      833fdf1

    17. vstinner commented on Oct 1, 2021

      @vstinner
      vstinner
      on Oct 1, 2021
      Member
      More actions

      New changeset 6df8c32 by Victor Stinner in branch '3.10':
      bpo-41710: PyThread_acquire_lock_timed() uses sem_clockwait() (GH-28671)
      6df8c32

    18. vstinner commented on Oct 1, 2021

      @vstinner
      vstinner
      on Oct 1, 2021
      Member
      More actions

      New changeset 0e1aeab by Miss Islington (bot) in branch '3.9':
      bpo-41710: PyThread_acquire_lock_timed() uses sem_clockwait() (GH-28671) (GH-28683)
      0e1aeab

    19. vstinner commented on Oct 1, 2021

      @vstinner
      vstinner
      on Oct 1, 2021
      Member
      More actions

      Jonas Norling: Thanks for the bug report! It's now fixed in 3.9, 3.10 and main branches.

    20. vstinner
      added
      3.9 (EOL)end of lifeend of life
      3.10 (EOL)end of lifeend of life
      on Oct 1, 2021
    21. vstinner
      closed this as completedon Oct 1, 2021
    22. vstinner commented on Oct 14, 2021

      @vstinner
      vstinner
      on Oct 14, 2021
      Member
      More actions

      New changeset 03bbc60 by Victor Stinner in branch 'main':
      bpo-41710: Fix What's New Entry credit (GH-28962)
      03bbc60

    23. vstinner commented on Dec 6, 2021

      @vstinner
      vstinner
      on Dec 6, 2021
      Member
      More actions

      bpo-33632 "undefined behaviour: signed integer overflow in threadmodule.c" has been fixed by this change:

      New changeset 833fdf1 by Victor Stinner in branch 'main':
      bpo-41710: Add private _PyDeadline_Get() function (GH-28674)
      833fdf1

    24. ezio-melotti
      transferred this issue fromon Apr 10, 2022
    25. vstinner
      added a commit that references this issue on Nov 17, 2023

      pythongh-108724: Use _PyTime_GetMonotonicClock() in parking_lot.c

      71a000c
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      3.10 (EOL)end of lifeend of life3.11only security fixesonly security fixes3.9 (EOL)end of lifeend of lifeinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        You are visitor 01402503 — GeezerVison does not store the pages you look up.
        Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.