Skip to content

Commit

Permalink
[3.12] pythongh-112536: Add TSAN build on Github Actions (pythonGH-11…
Browse files Browse the repository at this point in the history
…6872)

(cherry picked from commit 20578a1)

Co-authored-by: Donghee Na <donghee.na@python.org>
  • Loading branch information
pitrou and corona10 committed Mar 18, 2024
1 parent fcb2301 commit 25243b1
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 0 deletions.
11 changes: 11 additions & 0 deletions .github/workflows/build.yml
Expand Up @@ -471,6 +471,15 @@ jobs:
- name: Tests
run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu"

build_tsan:
name: 'Thread sanitizer'
needs: check_source
if: needs.check_source.outputs.run_tests == 'true'
uses: ./.github/workflows/reusable-tsan.yml
with:
config_hash: ${{ needs.check_source.outputs.config_hash }}
options: ./configure --config-cache --with-thread-sanitizer --with-pydebug

all-required-green: # This job does nothing and is only used for the branch protection
name: All required checks pass
if: always()
Expand All @@ -485,6 +494,7 @@ jobs:
- build_windows
- test_hypothesis
- build_asan
- build_tsan

runs-on: ubuntu-latest

Expand Down Expand Up @@ -513,6 +523,7 @@ jobs:
build_ubuntu_ssltests,
build_windows,
build_asan,
build_tsan,
'
|| ''
}}
Expand Down
51 changes: 51 additions & 0 deletions .github/workflows/reusable-tsan.yml
@@ -0,0 +1,51 @@
on:
workflow_call:
inputs:
config_hash:
required: true
type: string
options:
required: true
type: string

jobs:
build_tsan_reusable:
name: 'Thread sanitizer'
runs-on: ubuntu-22.04
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Runner image version
run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV
- name: Restore config.cache
uses: actions/cache@v4
with:
path: config.cache
key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ inputs.config_hash }}
- name: Install Dependencies
run: |
sudo ./.github/workflows/posix-deps-apt.sh
sudo apt install -y clang
# Reduce ASLR to avoid TSAN crashing
sudo sysctl -w vm.mmap_rnd_bits=28
- name: TSAN Option Setup
run: |
echo "TSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/Tools/tsan/supressions.txt" >> $GITHUB_ENV
echo "CC=clang" >> $GITHUB_ENV
echo "CXX=clang++" >> $GITHUB_ENV
- name: Add ccache to PATH
run: |
echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
- name: Configure ccache action
uses: hendrikmuhs/ccache-action@v1.2
with:
save: ${{ github.event_name == 'push' }}
max-size: "200M"
- name: Configure CPython
run: ${{ inputs.options }}
- name: Build CPython
run: make -j4
- name: Display build info
run: make pythoninfo
- name: Tests
run: ./python -m test --tsan -j4
4 changes: 4 additions & 0 deletions Lib/test/test_concurrent_futures/util.py
Expand Up @@ -85,6 +85,8 @@ def get_context(self):
self.skipTest("ProcessPoolExecutor unavailable on this system")
if sys.platform == "win32":
self.skipTest("require unix system")
if support.check_sanitizer(thread=True):
self.skipTest("TSAN doesn't support threads after fork")
return super().get_context()


Expand All @@ -111,6 +113,8 @@ def get_context(self):
self.skipTest("ProcessPoolExecutor unavailable on this system")
if sys.platform == "win32":
self.skipTest("require unix system")
if support.check_sanitizer(thread=True):
self.skipTest("TSAN doesn't support threads after fork")
return super().get_context()


Expand Down
4 changes: 4 additions & 0 deletions Lib/test/test_logging.py
Expand Up @@ -80,6 +80,9 @@
skip_if_asan_fork = unittest.skipIf(
support.HAVE_ASAN_FORK_BUG,
"libasan has a pthread_create() dead lock related to thread+fork")
skip_if_tsan_fork = unittest.skipIf(
support.check_sanitizer(thread=True),
"TSAN doesn't support threads after fork")


class BaseTest(unittest.TestCase):
Expand Down Expand Up @@ -737,6 +740,7 @@ def remove_loop(fname, tries):
@support.requires_fork()
@threading_helper.requires_working_threading()
@skip_if_asan_fork
@skip_if_tsan_fork
def test_post_fork_child_no_deadlock(self):
"""Ensure child logging locks are not held; bpo-6721 & bpo-36533."""
class _OurHandler(logging.Handler):
Expand Down
4 changes: 4 additions & 0 deletions Python/thread_pthread.h
Expand Up @@ -91,6 +91,10 @@
#endif
#endif

/* Thread sanitizer doesn't currently support sem_clockwait */
#ifdef _Py_THREAD_SANITIZER
#undef HAVE_SEM_CLOCKWAIT
#endif

/* Whether or not to use semaphores directly rather than emulating them with
* mutexes and condition variables:
Expand Down

0 comments on commit 25243b1

Please sign in to comment.