15
15
#include " pybind11_tests.h"
16
16
#include < atomic>
17
17
#include < iostream>
18
+ #include < mutex>
18
19
#include < thread>
19
20
20
21
22
+ std::mutex couterr_mutex;
23
+
24
+
21
25
void noisy_function (std::string msg, bool flush) {
22
26
27
+ const std::lock_guard<std::mutex> lock (couterr_mutex);
23
28
std::cout << msg;
24
29
if (flush)
25
30
std::cout << std::flush;
26
31
}
27
32
28
33
void noisy_funct_dual (std::string msg, std::string emsg) {
34
+ const std::lock_guard<std::mutex> lock (couterr_mutex);
29
35
std::cout << msg;
30
36
std::cerr << emsg;
31
37
}
@@ -37,7 +43,10 @@ struct TestThread {
37
43
TestThread () : t_{nullptr }, stop_{false } {
38
44
auto thread_f = [this ] {
39
45
while (!stop_) {
40
- std::cout << " x" << std::flush;
46
+ {
47
+ const std::lock_guard<std::mutex> lock (couterr_mutex);
48
+ std::cout << " x" << std::flush;
49
+ }
41
50
std::this_thread::sleep_for (std::chrono::microseconds (50 ));
42
51
} };
43
52
t_ = new std::thread (std::move (thread_f));
@@ -72,11 +81,13 @@ TEST_SUBMODULE(iostream, m) {
72
81
73
82
m.def (" captured_output_default" , [](std::string msg) {
74
83
py::scoped_ostream_redirect redir;
84
+ const std::lock_guard<std::mutex> lock (couterr_mutex);
75
85
std::cout << msg << std::flush;
76
86
});
77
87
78
88
m.def (" captured_output" , [](std::string msg) {
79
89
py::scoped_ostream_redirect redir (std::cout, py::module_::import (" sys" ).attr (" stdout" ));
90
+ const std::lock_guard<std::mutex> lock (couterr_mutex);
80
91
std::cout << msg << std::flush;
81
92
});
82
93
@@ -86,6 +97,7 @@ TEST_SUBMODULE(iostream, m) {
86
97
87
98
m.def (" captured_err" , [](std::string msg) {
88
99
py::scoped_ostream_redirect redir (std::cerr, py::module_::import (" sys" ).attr (" stderr" ));
100
+ const std::lock_guard<std::mutex> lock (couterr_mutex);
89
101
std::cerr << msg << std::flush;
90
102
});
91
103
@@ -96,16 +108,19 @@ TEST_SUBMODULE(iostream, m) {
96
108
py::arg (" msg" ), py::arg (" emsg" ));
97
109
98
110
m.def (" raw_output" , [](std::string msg) {
111
+ const std::lock_guard<std::mutex> lock (couterr_mutex);
99
112
std::cout << msg << std::flush;
100
113
});
101
114
102
115
m.def (" raw_err" , [](std::string msg) {
116
+ const std::lock_guard<std::mutex> lock (couterr_mutex);
103
117
std::cerr << msg << std::flush;
104
118
});
105
119
106
120
m.def (" captured_dual" , [](std::string msg, std::string emsg) {
107
121
py::scoped_ostream_redirect redirout (std::cout, py::module_::import (" sys" ).attr (" stdout" ));
108
122
py::scoped_ostream_redirect redirerr (std::cerr, py::module_::import (" sys" ).attr (" stderr" ));
123
+ const std::lock_guard<std::mutex> lock (couterr_mutex);
109
124
std::cout << msg << std::flush;
110
125
std::cerr << emsg << std::flush;
111
126
});
0 commit comments