userver: userver/engine/io/common.hpp Source File
Loading...
Searching...
No Matches
common.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/engine/io/common.hpp
4/// @brief Common definitions and base classes for stream like objects
5
6#include <cstddef>
7#include <memory>
8#include <optional>
9
10#include <userver/engine/deadline.hpp>
11
12USERVER_NAMESPACE_BEGIN
13
14namespace engine::impl {
15class ContextAccessor;
16}
17
18namespace engine::io {
19
20/// File descriptor of an invalid pipe end.
21inline constexpr int kInvalidFd = -1;
22
23/// @ingroup userver_base_classes
24///
25/// Interface for readable streams
27 public:
28 virtual ~ReadableBase();
29
30 /// Whether the stream is valid.
31 virtual bool IsValid() const = 0;
32
33 /// Suspends current task until the stream has data available.
34 [[nodiscard]] virtual bool WaitReadable(Deadline) = 0;
35
36 /// Receives up to len (including zero) bytes from the stream.
37 /// @returns filled-in optional on data presense (e.g. 0, 1, 2... bytes)
38 /// empty optional otherwise
40 size_t len) {
41 (void)buf;
42 (void)len;
43 UINVARIANT(false, "not implemented yet");
44 return {};
45 }
46
47 /// Receives at least one byte from the stream.
48 [[nodiscard]] virtual size_t ReadSome(void* buf, size_t len,
49 Deadline deadline) = 0;
50
51 /// Receives exactly len bytes from the stream.
52 /// @note Can return less than len if stream is closed by peer.
53 [[nodiscard]] virtual size_t ReadAll(void* buf, size_t len,
54 Deadline deadline) = 0;
55
56 /// For internal use only
57 impl::ContextAccessor* TryGetContextAccessor() { return ca_; }
58
59 protected:
60 void SetReadableContextAccessor(impl::ContextAccessor* ca) { ca_ = ca; }
61
62 private:
63 impl::ContextAccessor* ca_{nullptr};
64};
65
66/// IoData for vector send
67struct IoData final {
68 const void* data;
69 size_t len;
70};
71
72/// @ingroup userver_base_classes
73///
74/// Interface for writable streams
76 public:
77 virtual ~WritableBase();
78
79 /// Suspends current task until the data is available.
80 [[nodiscard]] virtual bool WaitWriteable(Deadline deadline) = 0;
81
82 /// @brief Sends exactly len bytes of buf.
83 /// @note Can return less than len if stream is closed by peer.
84 [[nodiscard]] virtual size_t WriteAll(const void* buf, size_t len,
85 Deadline deadline) = 0;
86
87 [[nodiscard]] virtual size_t WriteAll(std::initializer_list<IoData> list,
88 Deadline deadline) {
89 size_t result{0};
90 for (const auto& io_data : list) {
91 result += WriteAll(io_data.data, io_data.len, deadline);
92 }
93 return result;
94 }
95
96 /// For internal use only
97 impl::ContextAccessor* TryGetContextAccessor() { return ca_; }
98
99 protected:
100 void SetWritableContextAccessor(impl::ContextAccessor* ca) { ca_ = ca; }
101
102 private:
103 impl::ContextAccessor* ca_{nullptr};
104};
105
106/// @ingroup userver_base_classes
107///
108/// Interface for readable and writable streams
109// NOLINTNEXTLINE(fuchsia-multiple-inheritance)
110class RwBase : public ReadableBase, public WritableBase {
111 public:
112 ~RwBase() override;
113
114 ReadableBase& GetReadableBase() { return *this; }
115
116 WritableBase& GetWritableBase() { return *this; }
117};
118
119using ReadableBasePtr = std::shared_ptr<ReadableBase>;
120
121} // namespace engine::io
122
123USERVER_NAMESPACE_END