66#include < cassert>
77#include < thread>
88
9- #ifdef PYBIND11_CPP20
9+ #if defined(__has_include) && __has_include(<barrier>)
10+ # define PYBIND11_HAS_BARRIER 1
1011# include < barrier>
12+ #endif
1113
1214// Referenced test implementation: https://github.com/PyO3/pyo3/blob/v0.25.0/src/sync.rs#L874
1315class BoolWrapper {
@@ -20,6 +22,7 @@ class BoolWrapper {
2022 std::atomic<bool > value_;
2123};
2224
25+ #ifdef PYBIND11_HAS_BARRIER
2326void test_scoped_critical_section (py::class_<BoolWrapper> &cls) {
2427 auto barrier = std::barrier (2 );
2528 auto bool_wrapper = cls (false );
@@ -108,25 +111,23 @@ TEST_SUBMODULE(scoped_critical_section, m) {
108111#else
109112 false ;
110113#endif
111- m.attr (" has_barrier" ) =
112- #if defined(PYBIND11_CPP20)
113- true ;
114- #else
115- false ;
116- #endif
117114
118- #ifdef PYBIND11_CPP20
119115 auto BoolWrapperClass = py::class_<BoolWrapper>(m, " BoolWrapper" )
120116 .def (py::init<bool >())
121117 .def (" get" , &BoolWrapper::get)
122118 .def (" set" , &BoolWrapper::set);
123119
120+ #ifdef PYBIND11_HAS_BARRIER
121+ m.attr (" has_barrier" ) = true ;
122+
124123 m.def (" test_scoped_critical_section" ,
125124 [&]() -> void { test_scoped_critical_section (BoolWrapperClass); });
126125 m.def (" test_scoped_critical_section2" ,
127126 [&]() -> void { test_scoped_critical_section2 (BoolWrapperClass); });
128127 m.def (" test_scoped_critical_section2_same_object_no_deadlock" , [&]() -> void {
129128 test_scoped_critical_section2_same_object_no_deadlock (BoolWrapperClass);
130129 });
130+ #else
131+ m.attr (" has_barrier" ) = false ;
131132#endif
132133}
0 commit comments