69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
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()
 |