python/cpython

Commits on Nov 18, 2020

  1. bpo-42398: Fix "make regen-all" race condition (GH-23362)

    Fix a race condition in "make regen-all" when make -jN option is used
    to run jobs in parallel. The clinic.py script now only use atomic
    write to write files. Moveover, generated files are now left
    unchanged if the content does not change, to not change the file
    modification time.
    
    The "make regen-all" command runs "make clinic" and "make
    regen-importlib" targets:
    
    * "make regen-importlib" builds object files (ex: Modules/_weakref.o)
      from source files (ex: Modules/_weakref.c) and clinic files (ex:
      Modules/clinic/_weakref.c.h)
    * "make clinic" always rewrites all clinic files
      (ex: Modules/clinic/_weakref.c.h)
    
    Since there is no dependency between "clinic" and "regen-importlib"
    Makefile targets, these two targets can be run in parallel. Moreover,
    half of clinic.py file writes are not atomic and so there is a race
    condition when "make regen-all" runs jobs in parallel using make -jN
    option (which can be passed in MAKEFLAGS environment variable).
    
    Fix clinic.py to make all file writes atomic:
    
    * Add write_file() function to ensure that all file writes are
      atomic: write into a temporary file and then use os.replace().
    * Moreover, write_file() doesn't recreate or modify the file if the
      content does not change to avoid modifying the file modification
      file.
    * Update test_clinic to verify these assertions with a functional
      test.
    * Remove Clinic.force attribute which was no longer used, whereas
      Clinic.verify remains useful.

Commits on Nov 17, 2020

  1. bpo-41686: Always create the SIGINT event on Windows (GH-23344)

    bpo-41686, bpo-41713: On Windows, the SIGINT event,
    _PyOS_SigintEvent(), is now created even if Python is configured to
    not install signal handlers (PyConfig.install_signal_handlers=0 or
    Py_InitializeEx(0)).
    
    Changes:
    
    * Move global variables initialization from signal_exec() to
      _PySignal_Init() to clarify that they are global variables cleared
      by _PySignal_Fini().
    * _PySignal_Fini() now closes sigint_event.
    * IntHandler is no longer a global variable.

Commits on Nov 16, 2020

  1. bpo-37205: time.time() cannot fail with fatal error (GH-23314)

    time.time(), time.perf_counter() and time.monotonic() functions can
    no longer fail with a Python fatal error, instead raise a regular
    Python exception on failure.
    
    Remove _PyTime_Init(): don't check system, monotonic and perf counter
    clocks at startup anymore.
    
    On error, _PyTime_GetSystemClock(), _PyTime_GetMonotonicClock() and
    _PyTime_GetPerfCounter() now silently ignore the error and return 0.
    They cannot fail with a Python fatal error anymore.
    
    Add py_mach_timebase_info() and win_perf_counter_frequency()
    sub-functions.