Skip to content

TSAN race in _waiting_release #123828

@ccotter

Description

@ccotter

Bug report

Bug description:

A TSAN (gcc-12) build of the latest version of cpython reports a race in the test_send_recv_different_interpreters_and_threads test:

  Read of size 4 at 0x7ffe8d0c9338 by main thread:
    #0 _waiting_finish_releasing Modules/_interpchannelsmodule.c:504 (_interpchannels.cpython-314-x86_64-linux-gnu.so+0x88f4) (BuildId: 233ea3cec8e2d6b4a5322cdab2aa3fcc24ab85f8)
    #1 channel_send_wait Modules/_interpchannelsmodule.c:1852 (_interpchannels.cpython-314-x86_64-linux-gnu.so+0x88f4)
    #2 channelsmod_send Modules/_interpchannelsmodule.c:3096 (_interpchannels.cpython-314-x86_64-linux-gnu.so+0x8dd0) (BuildId: 233ea3cec8e2d6b4a5322cdab2aa3fcc24ab85f8)
    #3 cfunction_call Objects/methodobject.c:540 (python+0x549e55) (BuildId: f667f6a4a823ca3db627f9e7bf3836f7af978c6d)

    #0 _waiting_release Modules/_interpchannelsmodule.c:498 (_interpchannels.cpython-314-x86_64-linux-gnu.so+0x37c7) (BuildId: 233ea3cec8e2d6b4a5322cdab2aa3fcc24ab85f8)
    #1 channel_recv Modules/_interpchannelsmodule.c:1937 (_interpchannels.cpython-314-x86_64-linux-gnu.so+0x863a) (BuildId: 233ea3cec8e2d6b4a5322cdab2aa3fcc24ab85f8)
    #2 channelsmod_recv Modules/_interpchannelsmodule.c:3189 (_interpchannels.cpython-314-x86_64-linux-gnu.so+0x863a)

Indeed,

while (waiting->status == WAITING_RELEASING) {
spin waits for waiting->status to change state, with
waiting->status = WAITING_RELEASED;
triggering the spinning thread to exit the spin. Neither happens under a mutex, or with any release-acquire sequencing.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Projects

    Status

    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions