Skip to content

Commit 33e12d8

Browse files
authored
simplify capy result handlers with latch (#55)
1 parent 8cd02e0 commit 33e12d8

3 files changed

Lines changed: 25 additions & 73 deletions

File tree

examples/capy_reco.cpp

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22
#include <tbb/task_arena.h>
33

44
#include <boost/capy.hpp>
5-
#include <condition_variable>
65
#include <cstddef>
76
#include <iostream>
8-
#include <mutex>
7+
#include <latch>
98
#include <string_view>
109

1110
#include "capy_stream_await.hpp" // StreamIoAwaitable
@@ -167,27 +166,17 @@ int main() {
167166
std::cout << "--- Single event, synchronous wait for completion ---\n";
168167
cudaStream_t stream;
169168
ERROR_CHECK_CUDA(cudaStreamCreate(&stream));
170-
auto condition = std::condition_variable();
171-
auto mutex = std::mutex();
172169
auto final_result = tools::StatusCode{};
173-
auto result_handler = [&condition, &mutex,
174-
&final_result](tools::StatusCode code) {
175-
{
176-
std::lock_guard lock(mutex);
177-
final_result = code;
178-
}
179-
condition.notify_one();
170+
auto done = std::latch{1};
171+
auto result_handler = [&done, &final_result](tools::StatusCode code) {
172+
final_result = code;
173+
done.count_down();
180174
};
181175

182176
log() << "main Launching algorithm..." << std::endl;
183177
boost::capy::run_async(executor,
184178
result_handler)(reconstruct(stream, "main"));
185-
{
186-
auto lock = std::unique_lock(mutex);
187-
condition.wait(lock, [&final_result]() {
188-
return final_result != tools::StatusCode::UNDEFINED;
189-
});
190-
}
179+
done.wait();
191180
log() << "main Final status of algorithm " << final_result << ""
192181
<< std::endl;
193182
ERROR_CHECK_CUDA(cudaStreamDestroy(stream));
@@ -202,31 +191,18 @@ int main() {
202191
ERROR_CHECK_CUDA(cudaStreamCreate(&stream));
203192
}
204193

205-
auto condition = std::condition_variable();
206-
auto mutex = std::mutex();
207-
auto counter = streams.size();
194+
auto done = std::latch{static_cast<std::ptrdiff_t>(streams.size())};
208195
log() << "main Launching algorithms..." << std::endl;
209196

210197
for (std::size_t i = 0; i < streams.size(); ++i) {
211-
auto result_handler = [&condition, &mutex, &status, &counter,
212-
i](tools::StatusCode code) {
213-
auto done = false;
214-
{
215-
std::lock_guard lock(mutex);
216-
status.at(i) = code;
217-
done = (--counter == 0);
218-
}
219-
if (done) {
220-
condition.notify_one();
221-
}
198+
auto result_handler = [&done, &status, i](tools::StatusCode code) {
199+
status.at(i) = code;
200+
done.count_down();
222201
};
223202
boost::capy::run_async(executor, result_handler)(
224203
reconstruct(streams.at(i), "event" + std::to_string(i)));
225204
}
226-
{
227-
auto lock = std::unique_lock(mutex);
228-
condition.wait(lock, [&counter]() { return counter == 0; });
229-
}
205+
done.wait();
230206
for (auto& stream : streams) {
231207
ERROR_CHECK_CUDA(cudaStreamDestroy(stream));
232208
}

examples/capy_task.cpp

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
#include <boost/capy.hpp>
22
#include <chrono>
3-
#include <condition_variable>
43
#include <coroutine>
54
#include <cstdlib>
6-
#include <mutex>
5+
#include <latch>
76
#include <string_view>
87

98
#include "capy_timer.hpp" // TimerIoAwaitable
@@ -133,29 +132,19 @@ int main() {
133132
auto pool_executor = pool.get_executor();
134133
auto verbose_executor = VerboseExecutor(pool_executor);
135134

136-
auto condition = std::condition_variable();
137-
auto mutex = std::mutex();
138135
auto final_result = algs::StatusCode{};
139-
auto result_handler = [&condition, &mutex,
140-
&final_result](algs::StatusCode code) {
141-
{
142-
std::lock_guard lock(mutex);
143-
final_result = code;
144-
}
145-
condition.notify_one();
136+
auto done = std::latch{1};
137+
auto result_handler = [&done, &final_result](algs::StatusCode code) {
138+
final_result = code;
139+
done.count_down();
146140
};
147141

148142
log() << "main launching algorithm" << std::endl;
149143
boost::capy::run_async(verbose_executor,
150144
result_handler)(algorithm_execute("main"));
151145

152-
{
153-
log() << "main waiting for algorithm to finish..." << std::endl;
154-
auto lock = std::unique_lock(mutex);
155-
condition.wait(lock, [&final_result]() {
156-
return final_result != algs::StatusCode::UNDEFINED;
157-
});
158-
}
146+
log() << "main waiting for algorithm to finish..." << std::endl;
147+
done.wait();
159148
log() << "Final status of algorithm " << final_result << std::endl;
160149

161150
log() << "main Done" << std::endl;

examples/capy_tbb.cpp

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22

33
#include <boost/capy.hpp>
44
#include <chrono>
5-
#include <condition_variable>
65
#include <cstdlib>
7-
#include <mutex>
6+
#include <latch>
87
#include <string_view>
9-
#include <thread>
10-
#include <utility>
118

129
#include "capy_task_arena_executor.hpp" // TaskArenaExecutor
1310
#include "capy_timer.hpp" // TimerIoAwaitable
@@ -103,27 +100,17 @@ int main() {
103100
auto context = TaskArenaContext(arena);
104101
auto executor = TaskArenaExecutor(context);
105102

106-
auto condition = std::condition_variable();
107-
auto mutex = std::mutex();
108103
auto final_result = algs::StatusCode{};
109-
auto result_handler = [&condition, &mutex,
110-
&final_result](algs::StatusCode code) {
111-
{
112-
std::lock_guard lock(mutex);
113-
final_result = code;
114-
}
115-
condition.notify_one();
104+
auto done = std::latch{1};
105+
auto result_handler = [&done, &final_result](algs::StatusCode code) {
106+
final_result = code;
107+
done.count_down();
116108
};
117109

118110
boost::capy::run_async(executor, result_handler)(algorithm_execute("main"));
119111

120-
{
121-
log() << "main waiting for algorithm to finish..." << std::endl;
122-
auto lock = std::unique_lock(mutex);
123-
condition.wait(lock, [&final_result]() {
124-
return final_result != algs::StatusCode::UNDEFINED;
125-
});
126-
}
112+
log() << "main waiting for algorithm to finish..." << std::endl;
113+
done.wait();
127114

128115
log() << "Final status of algorithm " << final_result << std::endl;
129116
// Block until all work items in the scope are done

0 commit comments

Comments
 (0)