diff --git a/Makefile b/Makefile index c3738e3..216e614 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception SANITIZERS = none debug msan asan usan tsan -.PHONY: default gcc clang run update check ce todo distclean clean build test all $(SANITIZERS) +.PHONY: default gcc clang run update check ce todo distclean clean build test all format $(SANITIZERS) COMPILER=system CXX_BASE=$(CXX:$(dir $(CXX))%=%) @@ -88,6 +88,9 @@ check: todo: bin/mk-todo.py +format: + git clang-format main + clean: $(RM) -r $(BUILD) $(RM) mkerr olderr *~ diff --git a/include/beman/net/detail/event_type.hpp b/include/beman/net/detail/event_type.hpp new file mode 100644 index 0000000..6d44ea2 --- /dev/null +++ b/include/beman/net/detail/event_type.hpp @@ -0,0 +1,19 @@ +// include/beman/net/detail/event_type.hpp -*-C++-*- +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef INCLUDED_INCLUDE_BEMAN_NET_DETAIL_EVENT_TYPE +#define INCLUDED_INCLUDE_BEMAN_NET_DETAIL_EVENT_TYPE + +#include + +// ---------------------------------------------------------------------------- + +namespace beman::net { +enum class event_type { none = 0x00, in = 0x01, out = 0x02, in_out = 0x03 }; +constexpr ::beman::net::event_type operator&(::beman::net::event_type e0, ::beman::net::event_type e1) { + return ::beman::net::event_type(::std::uint8_t(e0) & ::std::uint8_t(e1)); +} +} // namespace beman::net +// ---------------------------------------------------------------------------- + +#endif diff --git a/include/beman/net/detail/io_base.hpp b/include/beman/net/detail/io_base.hpp index 42a9a5e..e7e2070 100644 --- a/include/beman/net/detail/io_base.hpp +++ b/include/beman/net/detail/io_base.hpp @@ -5,6 +5,7 @@ #define INCLUDED_BEMAN_NET_DETAIL_IO_BASE #include +#include #include #include #include @@ -51,11 +52,11 @@ struct beman::net::detail::io_base io_base* next{nullptr}; // used for an intrusive list ::beman::net::detail::context_base* context{nullptr}; ::beman::net::detail::socket_id id; // the entity affected - int event; // mask for expected events + ::beman::net::event_type event; // mask for expected events work_t work; extra_t extra{nullptr, +[](void*){}}; - io_base(::beman::net::detail::socket_id i, int ev) : id(i), event(ev) {} + io_base(::beman::net::detail::socket_id i, ::beman::net::event_type ev) : id(i), event(ev) {} virtual ~io_base() = default; virtual auto complete() -> void = 0; @@ -73,7 +74,7 @@ struct beman::net::detail::io_operation , Data { template - io_operation(::beman::net::detail::socket_id i, int ev, D&& a = Data()) + io_operation(::beman::net::detail::socket_id i, ::beman::net::event_type ev, D&& a = Data()) : io_base(i, ev), Data(::std::forward(a)) {} }; diff --git a/include/beman/net/detail/operations.hpp b/include/beman/net/detail/operations.hpp index 80596ec..6fc96f9 100644 --- a/include/beman/net/detail/operations.hpp +++ b/include/beman/net/detail/operations.hpp @@ -7,6 +7,7 @@ #define INCLUDED_INCLUDE_BEMAN_NET_DETAIL_OPERATIONS #include +#include #include // ---------------------------------------------------------------------------- @@ -67,7 +68,7 @@ struct beman::net::detail::accept_desc data(acceptor_t& a): d_acceptor(a) {} auto id() const { return this->d_acceptor.id(); } - auto events() const { return POLLIN; } + auto events() const { return ::beman::net::event_type::in; } auto get_scheduler() { return this->d_acceptor.get_scheduler(); } auto set_value(operation& o, auto&& receiver) { @@ -95,7 +96,7 @@ struct beman::net::detail::connect_desc Socket& d_socket; auto id() const { return this->d_socket.id(); } - auto events() const { return POLLIN | POLLOUT; } + auto events() const { return ::beman::net::event_type::in_out; } auto get_scheduler() { return this->d_socket.get_scheduler(); } auto set_value(operation&, auto&& receiver) { @@ -121,7 +122,7 @@ struct beman::net::detail::send_desc Buffers d_buffers; auto id() const { return this->d_stream.id(); } - auto events() const { return POLLOUT; } + auto events() const { return ::beman::net::event_type::out; } auto get_scheduler() { return this->d_stream.get_scheduler(); } auto set_value(operation& o, auto&& receiver) { @@ -156,7 +157,7 @@ struct beman::net::detail::send_to_desc Endpoint d_endpoint; auto id() const { return this->d_stream.id(); } - auto events() const { return POLLOUT; } + auto events() const { return ::beman::net::event_type::out; } auto get_scheduler() { return this->d_stream.get_scheduler(); } auto set_value(operation& o, auto&& receiver) { @@ -185,7 +186,7 @@ struct beman::net::detail::receive_desc Buffers d_buffers; auto id() const { return this->d_stream.id(); } - auto events() const { return POLLIN; } + auto events() const { return ::beman::net::event_type::in; } auto get_scheduler() { return this->d_stream.get_scheduler(); } auto set_value(operation& o, auto&& receiver) { @@ -219,7 +220,7 @@ struct beman::net::detail::receive_from_desc Endpoint d_endpoint; auto id() const { return this->d_stream.id(); } - auto events() const { return POLLIN; } + auto events() const { return ::beman::net::event_type::in; } auto get_scheduler() { return this->d_stream.get_scheduler(); } auto set_value(operation& o, auto&& receiver) { diff --git a/include/beman/net/detail/poll_context.hpp b/include/beman/net/detail/poll_context.hpp index 1daa336..7c8d420 100644 --- a/include/beman/net/detail/poll_context.hpp +++ b/include/beman/net/detail/poll_context.hpp @@ -208,7 +208,14 @@ struct beman::net::detail::poll_context final if (this->d_sockets[id].blocking || completion->work(*this, completion) == ::beman::net::detail::submit_result::submit) { - this->d_poll.emplace_back(::pollfd{this->native_handle(id), short(completion->event), short()}); + decltype(pollfd().events) events{}; + if (bool(completion->event & ::beman::net::event_type::in)) { + events |= POLLIN; + } + if (bool(completion->event & ::beman::net::event_type::out)) { + events |= POLLOUT; + } + this->d_poll.emplace_back(::pollfd{this->native_handle(id), events, short()}); this->d_outstanding.emplace_back(completion); this->wakeup(); return ::beman::net::detail::submit_result::submit; diff --git a/include/beman/net/detail/sender.hpp b/include/beman/net/detail/sender.hpp index 406adbe..6196003 100644 --- a/include/beman/net/detail/sender.hpp +++ b/include/beman/net/detail/sender.hpp @@ -90,10 +90,8 @@ struct beman::net::detail::sender_state { sender_state* d_state; cancel_callback(sender_state* s) - : ::beman::net::detail::io_base(::beman::net::detail::socket_id(), 0) - , d_state(s) - { - } + : ::beman::net::detail::io_base(::beman::net::detail::socket_id(), ::beman::net::event_type::none), + d_state(s) {} cancel_callback(cancel_callback&&) = default; auto operator()() { @@ -248,11 +246,9 @@ struct beman::net::detail::sender_cpo template <::beman::net::detail::ex::sender Upstream, typename... Args> auto operator()(Upstream&& u, Args&&... args) const { - using data = Desc::template data<::std::decay_t...>; - return ::beman::net::detail::sender>{ - data{::std::forward(args)...}, - ::std::forward(u) - }; + using Data = Desc::template data<::std::decay_t...>; + return ::beman::net::detail::sender>{ + Data{::std::forward(args)...}, ::std::forward(u)}; } }; diff --git a/include/beman/net/detail/timer.hpp b/include/beman/net/detail/timer.hpp index fb2073f..b946f41 100644 --- a/include/beman/net/detail/timer.hpp +++ b/include/beman/net/detail/timer.hpp @@ -8,6 +8,7 @@ #include #include +#include // ---------------------------------------------------------------------------- @@ -40,7 +41,7 @@ struct beman::net::detail::resume_after_desc ::std::chrono::microseconds d_duration; auto id() const -> ::beman::net::detail::socket_id { return {}; } - auto events() const { return decltype(POLLIN)(); } + auto events() const { return ::beman::net::event_type::none; } auto get_scheduler() { return this->d_scheduler; } auto set_value(operation&, auto&& receiver) { @@ -68,7 +69,7 @@ struct beman::net::detail::resume_at_desc ::std::chrono::system_clock::time_point d_time; auto id() const -> ::beman::net::detail::socket_id { return {}; } - auto events() const { return decltype(POLLIN)(); } + auto events() const { return ::beman::net::event_type::none; } auto get_scheduler() { return this->d_scheduler; } auto set_value(operation&, auto&& receiver) {