| from __future__ import annotations |
| |
| import sys |
| import threading |
| |
| import pytest |
| |
| from pybind11_tests import thread as m |
| |
| |
| class Thread(threading.Thread): |
| def __init__(self, fn): |
| super().__init__() |
| self.fn = fn |
| self.e = None |
| |
| def run(self): |
| try: |
| for i in range(10): |
| self.fn(i, i) |
| except Exception as e: |
| self.e = e |
| |
| def join(self): |
| super().join() |
| if self.e: |
| raise self.e |
| |
| |
| @pytest.mark.skipif(sys.platform.startswith("emscripten"), reason="Requires threads") |
| def test_implicit_conversion(): |
| a = Thread(m.test) |
| b = Thread(m.test) |
| c = Thread(m.test) |
| for x in [a, b, c]: |
| x.start() |
| for x in [c, b, a]: |
| x.join() |
| |
| |
| @pytest.mark.skipif(sys.platform.startswith("emscripten"), reason="Requires threads") |
| def test_implicit_conversion_no_gil(): |
| a = Thread(m.test_no_gil) |
| b = Thread(m.test_no_gil) |
| c = Thread(m.test_no_gil) |
| for x in [a, b, c]: |
| x.start() |
| for x in [c, b, a]: |
| x.join() |
| |
| |
| @pytest.mark.skipif(sys.platform.startswith("emscripten"), reason="Requires threads") |
| def test_bind_shared_instance(): |
| nb_threads = 4 |
| b = threading.Barrier(nb_threads) |
| |
| def access_shared_instance(): |
| b.wait() |
| for _ in range(1000): |
| m.EmptyStruct.SharedInstance # noqa: B018 |
| |
| threads = [ |
| threading.Thread(target=access_shared_instance) for _ in range(nb_threads) |
| ] |
| for thread in threads: |
| thread.start() |
| for thread in threads: |
| thread.join() |