diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bae02377f..146acadde 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,6 +52,8 @@ jobs: env: NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages + # Apply to every Mono host, including pytest and the .NET Python test runner. + MONO_THREADS_SUSPEND: preemptive # https://github.com/mono/mono/issues/21466 steps: - name: Checkout code uses: actions/checkout@v7 @@ -84,8 +86,6 @@ jobs: - name: Embedding tests (Mono/.NET Framework) if: always() run: dotnet test --runtime any-${{ matrix.os.platform }} --framework net472 --logger "console;verbosity=detailed" src/embed_tests/ - env: - MONO_THREADS_SUSPEND: preemptive # https://github.com/mono/mono/issues/21466 - name: Embedding tests (.NET Core) if: always() @@ -97,7 +97,7 @@ jobs: - name: Python Tests (Mono) if: always() - run: pytest --runtime mono + run: uv run pytest --runtime mono -v -o faulthandler_timeout=60 - name: Python Tests (.NET Framework) if: ${{ matrix.os.category == 'windows' }} diff --git a/doc/source/threading.rst b/doc/source/threading.rst index 02f7bc91a..4d25ac9f0 100644 --- a/doc/source/threading.rst +++ b/doc/source/threading.rst @@ -93,6 +93,20 @@ Forgetting this is the most common pythonnet threading bug. Symptoms range from immediate segfaults to subtle refcount corruption that crashes much later. +Mono thread suspension +---------------------- + +On Linux and macOS, Mono's cooperative/hybrid thread suspension can hang +when Python and managed threads interact. If affected, set +``MONO_THREADS_SUSPEND=preemptive`` before starting the process, as described +in `mono/mono#21466 `_. +CI uses this workaround for both embedding and Python-hosted tests. + +To run the Mono Python tests with per-test output and a Python thread +stack dump if a test takes longer than 60 seconds:: + + MONO_THREADS_SUSPEND=preemptive uv run pytest --runtime mono -v -o faulthandler_timeout=60 + Reference counting and finalizers ---------------------------------