mirror of https://github.com/pybind/pybind11
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.5 KiB
68 lines
1.5 KiB
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()
|
|
|