Skip to content

Commit 2cdd844

Browse files
committed
created the infrastructure for concurrent queues
1 parent c32b4fc commit 2cdd844

17 files changed

+501
-0
lines changed
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// include/beman/execution26/conqueue.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_CONQUEUE
5+
#define INCLUDED_BEMAN_EXECUTION26_CONQUEUE
6+
7+
// ----------------------------------------------------------------------------
8+
9+
#include <beman/execution26/detail/basic_concurrent_queue.hpp>
10+
#include <beman/execution26/detail/concurrent_queue.hpp>
11+
#include <beman/execution26/detail/async_concurrent_queue.hpp>
12+
#include <beman/execution26/detail/conqueue_errc.hpp>
13+
#include <beman/execution26/detail/conqueue_error.hpp>
14+
15+
// ----------------------------------------------------------------------------
16+
17+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// include/beman/execution26/detail/async_concurrent_queue.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_ASYNC_CONCURRENT_QUEUE
5+
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_ASYNC_CONCURRENT_QUEUE
6+
7+
#include <beman/execution26/execution.hpp>
8+
#include <beman/execution26/detail/basic_concurrent_queue.hpp>
9+
#include <beman/execution26/detail/sender_of.hpp>
10+
#include <utility>
11+
12+
// ----------------------------------------------------------------------------
13+
14+
namespace beman::execution26::detail {
15+
template <typename T, typename Q>
16+
concept async_concurrent_queue = ::beman::execution26::detail::basic_concurrent_queue<T, Q> && requires(Q q, T&& t) {
17+
{ q.async_push(::std::forward<T>(t)) } noexcept -> ::beman::execution26::detail::sender_of<>;
18+
{ q.async_pop() } noexcept -> ::beman::execution26::detail::sender_of<T>;
19+
};
20+
} // namespace beman::execution26::detail
21+
22+
// ----------------------------------------------------------------------------
23+
24+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// include/beman/execution26/detail/basic_concurrent_queue.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_BASIC_CONCURRENT_QUEUE
5+
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_BASIC_CONCURRENT_QUEUE
6+
7+
#include <concepts>
8+
#include <optional>
9+
#include <system_error>
10+
#include <type_traits>
11+
#include <utility>
12+
13+
// ----------------------------------------------------------------------------
14+
15+
namespace beman::execution26::detail {
16+
template <typename T, typename Q>
17+
concept basic_concurrent_queue =
18+
::std::move_constructible<::std::remove_cvref_t<T>> && ::std::same_as<::std::decay_t<T>, typename Q::value_type> &&
19+
requires(Q q, const Q qc, T&& t, ::std::error_code ec) {
20+
{ qc.is_closed() } noexcept -> ::std::same_as<bool>;
21+
{ q.close() } noexcept -> ::std::same_as<void>;
22+
{ q.push(std::forward<T>(t)) } -> ::std::same_as<void>;
23+
{ q.push(std::forward<T>(t), ec) } noexcept -> ::std::same_as<bool>;
24+
{ q.pop(ec) } -> ::std::same_as<::std::optional<T>>;
25+
{ q.pop() } -> ::std::same_as<T>;
26+
};
27+
} // namespace beman::execution26::detail
28+
// ----------------------------------------------------------------------------
29+
30+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// include/beman/execution26/detail/concurrent_queue.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_CONCURRENT_QUEUE
5+
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_CONCURRENT_QUEUE
6+
7+
#include <beman/execution26/detail/basic_concurrent_queue.hpp>
8+
#include <concepts>
9+
#include <optional>
10+
#include <utility>
11+
#include <system_error>
12+
13+
// ----------------------------------------------------------------------------
14+
15+
namespace beman::execution26::detail {
16+
template <typename T, typename Q>
17+
concept concurrent_queue =
18+
::beman::execution26::detail::basic_concurrent_queue<T, Q> && requires(Q q, T&& t, ::std::error_code ec) {
19+
{ q.try_push(::std::forward<T>(t), ec) } -> ::std::same_as<bool>;
20+
{ q.try_pop(ec) } -> ::std::same_as<::std::optional<T>>;
21+
};
22+
} // namespace beman::execution26::detail
23+
24+
// ----------------------------------------------------------------------------
25+
26+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// include/beman/execution26/detail/conqueue_errc.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_CONQUEUE_ERRC
5+
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_CONQUEUE_ERRC
6+
7+
#include <string>
8+
#include <system_error>
9+
#include <type_traits>
10+
11+
// ----------------------------------------------------------------------------
12+
13+
namespace beman::execution26 {
14+
enum class conqueue_errc { empty, full, closed, busy };
15+
16+
inline auto conqueue_category() noexcept -> const ::std::error_category&;
17+
inline auto make_error_code(::beman::execution26::conqueue_errc) noexcept -> ::std::error_code;
18+
inline auto make_error_condition(::beman::execution26::conqueue_errc) noexcept -> ::std::error_condition;
19+
} // namespace beman::execution26
20+
21+
namespace std {
22+
template <>
23+
struct is_error_code_enum<::beman::execution26::conqueue_errc> : ::std::true_type {};
24+
} // namespace std
25+
26+
// ----------------------------------------------------------------------------
27+
28+
inline auto beman::execution26::conqueue_category() noexcept -> const ::std::error_category& {
29+
struct category : ::std::error_category {
30+
auto name() const noexcept -> const char* override { return "conqueue"; }
31+
auto message(int value) const -> ::std::string override {
32+
switch (value) {
33+
default:
34+
return "unknown";
35+
case static_cast<int>(::beman::execution26::conqueue_errc::empty):
36+
return "empty";
37+
case static_cast<int>(::beman::execution26::conqueue_errc::full):
38+
return "full";
39+
case static_cast<int>(::beman::execution26::conqueue_errc::closed):
40+
return "closed";
41+
case static_cast<int>(::beman::execution26::conqueue_errc::busy):
42+
return "busy";
43+
}
44+
}
45+
};
46+
static category rc{};
47+
return rc;
48+
}
49+
50+
inline auto beman::execution26::make_error_code(conqueue_errc e) noexcept -> ::std::error_code {
51+
return ::std::error_code(static_cast<int>(e), ::beman::execution26::conqueue_category());
52+
}
53+
54+
inline auto beman::execution26::make_error_condition(conqueue_errc e) noexcept -> ::std::error_condition {
55+
return ::std::error_condition(static_cast<int>(e), ::beman::execution26::conqueue_category());
56+
}
57+
58+
// ----------------------------------------------------------------------------
59+
60+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// include/beman/execution26/detail/conqueue_error.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_CONQUEUE_ERROR
5+
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_CONQUEUE_ERROR
6+
7+
#include <beman/execution26/detail/conqueue_errc.hpp>
8+
#include <system_error>
9+
10+
// ----------------------------------------------------------------------------
11+
12+
namespace beman::execution26 {
13+
class conqueue_error : public ::std::system_error {
14+
public:
15+
explicit conqueue_error(::beman::execution26::conqueue_errc ec)
16+
: std::system_error(::beman::execution26::make_error_code(ec),
17+
::beman::execution26::conqueue_category().message(static_cast<int>(ec))) {}
18+
};
19+
} // namespace beman::execution26
20+
21+
// ----------------------------------------------------------------------------
22+
23+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// include/beman/execution26/detail/sender_in_of.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_SENDER_IN_OF
5+
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_SENDER_IN_OF
6+
7+
#include <beman/execution26/detail/sender_in.hpp>
8+
#include <beman/execution26/detail/matching_sig.hpp>
9+
#include <beman/execution26/detail/set_value.hpp>
10+
#include <beman/execution26/detail/value_types_of_t.hpp>
11+
#include <beman/execution26/detail/value_signature.hpp>
12+
13+
// ----------------------------------------------------------------------------
14+
15+
namespace beman::execution26::detail {
16+
template <typename Sender, typename Env, typename... A>
17+
concept sender_in_of =
18+
::beman::execution26::sender_in<Sender, Env> &&
19+
::beman::execution26::detail::matching_sig<
20+
::beman::execution26::set_value_t(A...),
21+
::beman::execution26::
22+
value_types_of_t<Sender, Env, ::beman::execution26::detail::value_signature, ::std::type_identity_t> >;
23+
}
24+
25+
// ----------------------------------------------------------------------------
26+
27+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// include/beman/execution26/detail/sender_of.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_SENDER_OF
5+
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_SENDER_OF
6+
7+
#include <beman/execution26/detail/empty_env.hpp>
8+
#include <beman/execution26/detail/sender_in_of.hpp>
9+
10+
// ----------------------------------------------------------------------------
11+
12+
namespace beman::execution26::detail {
13+
template <typename Sender, typename... A>
14+
concept sender_of = ::beman::execution26::detail::sender_in_of<Sender, ::beman::execution26::empty_env, A...>;
15+
}
16+
17+
// ----------------------------------------------------------------------------
18+
19+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// include/beman/execution26/detail/value_signature.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_VALUE_SIGNATURE
5+
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_VALUE_SIGNATURE
6+
7+
#include <beman/execution26/detail/set_value.hpp>
8+
9+
// ----------------------------------------------------------------------------
10+
11+
namespace beman::execution26::detail {
12+
template <typename... A>
13+
using value_signature = ::beman::execution26::set_value_t(A...);
14+
}
15+
16+
// ----------------------------------------------------------------------------
17+
18+
#endif

src/beman/execution26/CMakeLists.txt

+17
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ target_sources(
2424
BASE_DIRS
2525
${PROJECT_SOURCE_DIR}/include
2626
FILES
27+
${PROJECT_SOURCE_DIR}/include/beman/execution26/conqueue.hpp
2728
${PROJECT_SOURCE_DIR}/include/beman/execution26/execution.hpp
2829
${PROJECT_SOURCE_DIR}/include/beman/execution26/functional.hpp
2930
${PROJECT_SOURCE_DIR}/include/beman/execution26/stop_token.hpp
@@ -39,8 +40,12 @@ target_sources(
3940
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/apply_sender.hpp
4041
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/as_awaitable.hpp
4142
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/as_except_ptr.hpp
43+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/async_concurrent_queue.hpp
44+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/atomic_intrusive_stack.hpp
4245
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/await_result_type.hpp
4346
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/await_suspend_result.hpp
47+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/awaitable_sender.hpp
48+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/basic_concurrent_queue.hpp
4449
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/basic_operation.hpp
4550
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/basic_receiver.hpp
4651
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/basic_sender.hpp
@@ -49,21 +54,25 @@ target_sources(
4954
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/callable.hpp
5055
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/check_type_alias_exist.hpp
5156
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/child_type.hpp
57+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/class_type.hpp
5258
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/common.hpp
5359
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/completion_domain.hpp
5460
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/completion_signature.hpp
5561
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/completion_signatures.hpp
5662
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/completion_signatures_for.hpp
5763
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/completion_signatures_of_t.hpp
5864
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/completion_tag.hpp
65+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/concurrent_queue.hpp
5966
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/connect.hpp
6067
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/connect_all.hpp
6168
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/connect_all_result.hpp
6269
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/connect_awaitable.hpp
6370
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/connect_result_t.hpp
71+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/conqueue_errc.hpp
6472
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/continues_on.hpp
6573
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/decayed_same_as.hpp
6674
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/decayed_tuple.hpp
75+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/decayed_type_list.hpp
6776
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/decayed_typeof.hpp
6877
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/decays_to.hpp
6978
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/default_domain.hpp
@@ -97,6 +106,7 @@ target_sources(
97106
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/indirect_meta_apply.hpp
98107
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/inplace_stop_source.hpp
99108
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/into_variant.hpp
109+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/intrusive_stack.hpp
100110
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/is_awaitable.hpp
101111
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/is_awaiter.hpp
102112
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/join_env.hpp
@@ -138,9 +148,12 @@ target_sources(
138148
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sender.hpp
139149
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sender_adaptor.hpp
140150
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sender_adaptor_closure.hpp
151+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sender_awaitable.hpp
141152
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sender_decompose.hpp
142153
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sender_for.hpp
143154
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sender_in.hpp
155+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sender_in_of.hpp
156+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sender_of.hpp
144157
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/sends_stopped.hpp
145158
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/set_error.hpp
146159
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/set_stopped.hpp
@@ -149,6 +162,7 @@ target_sources(
149162
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/simple_counting_scope.hpp
150163
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/single_sender.hpp
151164
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/single_sender_value_type.hpp
165+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/split.hpp
152166
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/start.hpp
153167
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/starts_on.hpp
154168
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/state_type.hpp
@@ -165,15 +179,18 @@ target_sources(
165179
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/then.hpp
166180
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/transform_sender.hpp
167181
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/type_list.hpp
182+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/unspecified_promise.hpp
168183
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/unstoppable_token.hpp
169184
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/valid_completion_for.hpp
170185
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/valid_completion_signatures.hpp
171186
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/valid_specialization.hpp
187+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/value_signature.hpp
172188
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/value_types_of_t.hpp
173189
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/variant_or_empty.hpp
174190
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/when_all.hpp
175191
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/when_all_with_variant.hpp
176192
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/with_await_transform.hpp
193+
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/with_awaitable_senders.hpp
177194
${PROJECT_SOURCE_DIR}/include/beman/execution26/detail/write_env.hpp
178195
)
179196

tests/beman/execution26/CMakeLists.txt

+5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ endif()
1111
list(
1212
APPEND
1313
execution_tests
14+
conqueue-error.test
15+
conqueue-errc.test
16+
async-concurrent-queue.test
17+
concurrent-queue.test
18+
basic-concurrent-queue.test
1419
notify.test
1520
exec-scounting.test
1621
exec-awaitable.test

0 commit comments

Comments
 (0)