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
9#include <userver/engine/deadline.hpp>
10
11USERVER_NAMESPACE_BEGIN
12
13namespace engine::impl {
14class ContextAccessor;
15}
16
17namespace engine::io {
18
19/// File descriptor of an invalid pipe end.
20inline constexpr int kInvalidFd = -1;
21
22/// @ingroup userver_base_classes
23///
24/// Interface for readable streams
26 public:
27 virtual ~ReadableBase();
28
29 /// Whether the stream is valid.
30 virtual bool IsValid() const = 0;
31
32 /// Suspends current task until the stream has data available.
33 [[nodiscard]] virtual bool WaitReadable(Deadline) = 0;
34
35 /// Receives at least one byte from the stream.
36 [[nodiscard]] virtual size_t ReadSome(void* buf, size_t len,
37 Deadline deadline) = 0;
38
39 /// Receives exactly len bytes from the stream.
40 /// @note Can return less than len if stream is closed by peer.
41 [[nodiscard]] virtual size_t ReadAll(void* buf, size_t len,
42 Deadline deadline) = 0;
43
44 /// For internal use only
45 impl::ContextAccessor* TryGetContextAccessor() { return ca_; }
46
47 protected:
48 void SetReadableContextAccessor(impl::ContextAccessor* ca) { ca_ = ca; }
49
50 private:
51 impl::ContextAccessor* ca_{nullptr};
52};
53
54/// IoData for vector send
55struct IoData final {
56 const void* data;
57 size_t len;
58};
59
60/// @ingroup userver_base_classes
61///
62/// Interface for writable streams
64 public:
65 virtual ~WritableBase();
66
67 /// Suspends current task until the data is available.
68 [[nodiscard]] virtual bool WaitWriteable(Deadline deadline) = 0;
69
70 /// @brief Sends exactly len bytes of buf.
71 /// @note Can return less than len if stream is closed by peer.
72 [[nodiscard]] virtual size_t WriteAll(const void* buf, size_t len,
73 Deadline deadline) = 0;
74
75 [[nodiscard]] virtual size_t WriteAll(std::initializer_list<IoData> list,
76 Deadline deadline) {
77 size_t result{0};
78 for (const auto& io_data : list) {
79 result += WriteAll(io_data.data, io_data.len, deadline);
80 }
81 return result;
82 }
83
84 /// For internal use only
85 impl::ContextAccessor* TryGetContextAccessor() { return ca_; }
86
87 protected:
88 void SetWritableContextAccessor(impl::ContextAccessor* ca) { ca_ = ca; }
89
90 private:
91 impl::ContextAccessor* ca_{nullptr};
92};
93
94/// @ingroup userver_base_classes
95///
96/// Interface for readable and writable streams
97// NOLINTNEXTLINE(fuchsia-multiple-inheritance)
98class RwBase : public ReadableBase, public WritableBase {
99 public:
100 ~RwBase() override;
101
102 ReadableBase& GetReadableBase() { return *this; }
103
104 WritableBase& GetWritableBase() { return *this; }
105};
106
107using ReadableBasePtr = std::shared_ptr<ReadableBase>;
108
109} // namespace engine::io
110
111USERVER_NAMESPACE_END